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