您的位置:首页 > 其它

for循环中多线程的无序性

2015-11-08 19:13 330 查看
在学习多线程的互斥与同步中遇到一个问题,如下:
public class Test {
static int i;
public static void main(String[] args) {

for(i=0; i<10; i++){
new Thread(){
public void run(){
System.out.println(i);
}
}.start();
//    try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
}
}


出现结果在意料之外,结果共输出10次,不按顺序输出。之前询问学长,学长没有给我一个十分合理的答案。回头再网上看别人的博客,得到了一个比较合理的解答。

问题解答:

通过在主线程中的一个for循环,向线程池提交10个执行任务的时候,如果通过断点调试,发现先被添加到线程池中的线程先获得执行机会,后面阻塞等待信号量的线程也是先加入线程池的优先获得信号量。但是在执行的时候,实际情况则是乱序的。

主要的原因是因为执行的时候没有设置断点,住线程中的for循环在瞬间完成,也就是说机会在同一时刻向线程池中提交了10个执行任务,然后线程池会为这20个执行任务分配线程,然后挑出前5个线程执行。 等这5个线程中的一个执行完成以后,会按照一定的策略从剩下的线程中挑出一个来执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: