| 查看: 768 | 回复: 4 | |||
微尘、梦想木虫 (知名作家)
|
[求助]
关于java多线程啊~
|
刚学,莫笑~![]() 情况是这样的…… 三个线程: zhang.start(); //打印出我姓张 for{ //打印出我是主线程 } wang.start(); //打印出我姓王 情景1:循环9次,没有调用sleep(),由JVM自行管理,执行结果是主线程先执行结束,然后是zhang线程,最后是wang线程。我的理解是计算机执行太快了,所以没有看到希望的结果…… 情景2:于是呢,那就循环9000次吧,终于看到效果了,发现主线程打印了几百行,zhang线程才打印一行,然后又是主线程打印数百行。我发现JVM管理线程,时间分配似乎是随机的…… 情景3:还是循环9次,这次调用sleep(1),发现即使都中断1微秒,执行时间也没有平均分配,比如说,主线程执行2次,zhang线程执行1次,或者主线程执行1次,zhang线程执行3次等。 情景4:调换一下顺序: zhang.start(); //打印出我姓张 wang.start(); //打印出我姓王 for{ //打印出我是主线程 } 此时,有三个线程由JVM管理,但是他们的执行顺序也是随机的,并没有按所谓的排队顺序。 问题:就想问一下,当线程(比如说执行了zhang.start(); )交由JVM管理后,那么每一个线程执行时间和执行顺序都是由JVM随机分配的啊???????? |
» 猜你喜欢
康复大学泰山学者周祺惠团队招收博士研究生
已经有6人回复
AI论文写作工具:是科研加速器还是学术作弊器?
已经有3人回复
孩子确诊有中度注意力缺陷
已经有6人回复
2026博士申请-功能高分子,水凝胶方向
已经有6人回复
论文投稿,期刊推荐
已经有4人回复
硕士和导师闹得不愉快
已经有13人回复
请问2026国家基金面上项目会启动申2停1吗
已经有5人回复
同一篇文章,用不同账号投稿对编辑决定是否送审有没有影响?
已经有3人回复
ACS Applied Polymer Materials投稿
已经有10人回复
RSC ADV状态问题
已经有4人回复

hxyue
至尊木虫 (职业作家)
- 应助: 4 (幼儿园)
- 金币: 14031.5
- 散金: 106
- 红花: 33
- 帖子: 3505
- 在线: 388.6小时
- 虫号: 1378326
- 注册: 2011-08-24
- 专业: 计算机应用技术

2楼2011-09-17 11:05:49
hxyue
至尊木虫 (职业作家)
- 应助: 4 (幼儿园)
- 金币: 14031.5
- 散金: 106
- 红花: 33
- 帖子: 3505
- 在线: 388.6小时
- 虫号: 1378326
- 注册: 2011-08-24
- 专业: 计算机应用技术
【答案】应助回帖
★
xzhdty(金币+1): 欢迎常来程序语言看看 2011-09-17 15:03:33
微尘、梦想(金币+10): 2011-09-25 16:07:50
xzhdty(金币+1): 欢迎常来程序语言看看 2011-09-17 15:03:33
微尘、梦想(金币+10): 2011-09-25 16:07:50
|
虽然说线程是并发运行的。然而实际情况并非如此。对于多线程的程序,任务角色的不同使得每个线程的重要程度也不尽相同,如多个线程在等待获得CPU时间片,往往希望优先级高的线程优先抢占到CPU并得以执行。此外,多个线程交替执行时,不同优先级决定了级别高的线程将得到CPU的次数多一些且时间长一些,这样,高优先级的线程任务处理的效率明显就会更高一些,从而满足一些特殊的需要 但并不是说级别高的线程执行完了才会执行级别低的,那就不叫多线程了 |

3楼2011-09-17 11:13:03
微尘、梦想
木虫 (知名作家)
- 程序强帖: 6
- 应助: 2 (幼儿园)
- 贵宾: 0.353
- 金币: 4757.9
- 散金: 3089
- 红花: 31
- 沙发: 247
- 帖子: 8788
- 在线: 1125小时
- 虫号: 1203290
- 注册: 2011-02-14
- 专业: 制造系统与自动化

4楼2011-09-17 12:12:31
【答案】应助回帖
★ ★
余泽成(金币+2): 谢谢参与应助! 2011-09-18 00:16:20
微尘、梦想(金币+10): 2011-09-25 16:08:03
余泽成(金币+2): 谢谢参与应助! 2011-09-18 00:16:20
微尘、梦想(金币+10): 2011-09-25 16:08:03
|
虽然不懂Java,但是勉强插嘴下吧。 线程调度算法有很多种的,但是原则上来说还是高优先级抢占执行,同优先级竞争。竞争嘛,自然是有白痴进程抢不到了。 ![]() 实现优先级有很多不同的数据结构,比如优先级队列,最大堆,这个数据结构形成所谓的调度表。 每当生成一个线程,就会往调度表里面插入一个线程标识。由于数据结构的原因,高优先级总是在前面,但站位次序却不一定是排队的。 每执行完一个时间片,调度程序就会从调度表中选取一个线程继续执行,一般来说,这里的操作应该是将当前线程重新插入到调度表中,再读取其中一个线程。 对你的第一种代码, start就插入一个zhang线程到调度表 接着就foreach 然后再插入start.wang 肯定就是主线程与zhang互相竞争,竞争和排队又不同了,竞争是概率问题。 第二种代码的话,就是三个线程竞争。 不要设置优先级有两个考虑,一个是JVM的8级优先级并不是与系统完全映射了,不同系统的优先级别是不同的,调整优先级的不二法门是采用三级优先级:最高优先级、最低优先级和正常优先级。第二个问题是设置优先级可能在某些系统导致线程饿死,某些系统上却不会。 |

5楼2011-09-17 19:00:29














回复此楼
