for循环中多线程的无序性

在学习多线程的互斥与同步中遇到一个问题,如下:
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个线程中的一个执行完成以后,会按照一定的策略从剩下的线程中挑出一个来执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值