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个线程中的一个执行完成以后,会按照一定的策略从剩下的线程中挑出一个来执行。
相关文章推荐
- 信息安全系统设计基础第九周学习总结
- [leetcode] H-Index
- 字符紧缩对齐
- java源码分析02-HashMap
- 物理机与虚拟机共享文件夹方法
- 第九周学习总结
- java网络编程(三):一个类似QQ的聊天程序
- FCKeditor使用方法技术详解
- android 中设置控件隐藏
- Beaglebone Black(3)脚本文件控制
- android环境变量的配置
- 【软考之路】实战总结
- 【2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest F】【贪心+ STL-优先队列】 Gourmet and Banquet 最大活动时间
- lightOJ 1354 - IP Checking 【字符串处理&&进制转化】
- 典型用户 .
- 接口 构造器[构造函数]
- 《高性能网站建设指南》
- scanf 与 gets HDU1062
- windows xp部署iis+php+mysql
- 【C】【笔记】《C语言深度剖析》第七章 文件结构