您的位置:首页 > 编程语言 > Java开发

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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: