java自旋 和 操作系统唤醒线程优先级
2016-11-02 23:24
567 查看
直接上代码
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by chenzhichao on 16/11/2.
*/
public class TestQueue {
private static ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
private static AtomicInteger index = new AtomicInteger(0);
private static int[] start = new int[100];
private static int[] end = new int[100];
private static class Task implements Runnable{
int idx;
public Task(int idx) {this.idx=idx;}
@Override
public void run() {
try {
int i = index.getAndIncrement();
start[idx] = i;//System.out.println("start"+idx+" =====>"+i);
queue.put(""+i);
end[idx] = i;//System.out.println("end "+idx+" =====>"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
for(int i = 0;i<100;++i){
new Thread(new Task(i), ""+i).start();
//如果不睡眠, 结果会相对随机, 因为线程创建时间差不多, 操作系统调度优先级差不多
//如果睡眠, 因为创建时间不同, 而线程一直阻塞等待, 那么由于linux等操作系统, 在唤醒线程的时候, 阻塞时间越长的优先级越高, 所以会按照线程创建顺序唤醒
//Thread.sleep(50);
}
Thread.sleep(200); // 等待一段时间, 需要超过自旋时间
for(int j = 0;j<100;j++){
queue.take();
}
for(int i=0; i<100; i++){
System.out.println(start[i] + " " + end[i]);
}
}
}
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by chenzhichao on 16/11/2.
*/
public class TestQueue {
private static ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
private static AtomicInteger index = new AtomicInteger(0);
private static int[] start = new int[100];
private static int[] end = new int[100];
private static class Task implements Runnable{
int idx;
public Task(int idx) {this.idx=idx;}
@Override
public void run() {
try {
int i = index.getAndIncrement();
start[idx] = i;//System.out.println("start"+idx+" =====>"+i);
queue.put(""+i);
end[idx] = i;//System.out.println("end "+idx+" =====>"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
for(int i = 0;i<100;++i){
new Thread(new Task(i), ""+i).start();
//如果不睡眠, 结果会相对随机, 因为线程创建时间差不多, 操作系统调度优先级差不多
//如果睡眠, 因为创建时间不同, 而线程一直阻塞等待, 那么由于linux等操作系统, 在唤醒线程的时候, 阻塞时间越长的优先级越高, 所以会按照线程创建顺序唤醒
//Thread.sleep(50);
}
Thread.sleep(200); // 等待一段时间, 需要超过自旋时间
for(int j = 0;j<100;j++){
queue.take();
}
for(int i=0; i<100; i++){
System.out.println(start[i] + " " + end[i]);
}
}
}
相关文章推荐
- Java基础12:线程;等待唤醒机制;锁;线程优先级;
- 破除java神话之五:等待的线程是按照优先级顺序被唤醒的
- Java线程:线程的调度-优先级
- JAVA线程之二:线程的调度及优先级
- 【java多线程与并发库】---传统java多线程<4> .线程状态及优先级
- Java基础学习5_多线程(线程间通信--等待唤醒机制)
- Java线程:线程的调度-优先级
- [JAVA100例]067、线程优先级
- Java 多线程(三) 线程的生命周期及优先级
- JAVA线程优先级
- java例程练习(多线程[线程的优先级等等])
- Java中的线程的唤醒Thread.interrupt()
- java线程等待、设置优先级、同步、挂起、恢复(Join、setPriority、synchronized、wait、notify……)
- Java线程间通信-等待唤醒机制
- java多线程-线程优先级
- 【java多线程与并发库】---传统java多线程<4> .线程状态及优先级
- Java线程:线程的调度-优先级
- Java线程:线程的调度-优先级
- java线程的暂停与唤醒测试
- java线程技术6_线程的挂起和唤醒