‮ebotanihS
本帖最后由 Shinatobe 于 2019-12-22 08:46 编辑

比如有这么一个代码:
  1. new Thread(一个输出"A"的Runnable).start();
  2. new Thread(一个输出"B"的Runnable).start();
  3. new Thread(一个输出"C"的Runnable).start();
  4. new Thread(一个输出"D"的Runnable).start();
复制代码


虽然 B, C, D 的输出是乱序的,但是似乎 A 总是第一个输出。
有什么办法连 A 的执行也是乱序的呢?在开头加一个什么都不干的 Runnable 可行吗?或者有什么其他比较优雅的做法?



xiaolu550
本帖最后由 xiaolu550 于 2019-12-21 17:53 编辑

操作同一对象,并且该对象被操作的代码加锁

好吧。。上面没对题,上面是按照顺序跑

顺序无关实在没搞明白什么意思

可以让A sleep一会?个人感觉这个问题不太有意义,如果控制线程跑的先后顺序可以考虑CountDownLatch之类的

langyo
实在搞不懂为什么你一定要这么做

如果一定要连 A 的执行也随机,不妨试试生成随机数,随机挑选 A 到 D 中的任务执行

至于在 A 之前再加一个 Runnable 的做法,除非你这个所谓的空壳 Runnable 能做点什么计算、做到“占着茅坑不拉屎”,否则还是会被后来的 A “挤出厕所”的

1139365029
这样?
  1. if((new Random()).nextInt(100)<50){
  2.   new Thread(一个输出"A"的Runnable).start();
  3.   new Thread(一个输出"B"的Runnable).start();
  4.   new Thread(一个输出"C"的Runnable).start();
  5.   new Thread(一个输出"D"的Runnable).start();
  6. }else{
  7.   new Thread(一个输出"B"的Runnable).start();
  8.   new Thread(一个输出"C"的Runnable).start();
  9.   new Thread(一个输出"D"的Runnable).start();
  10.   new Thread(一个输出"A"的Runnable).start();
  11. }
复制代码

冰星
这个可能没法实现,线程怎么调用是由线程调度器说了算,开发人员没法决定线程调度器怎么做

1596886225
只是你运行时总是A第一个,线程的运行顺序应该是无序的,你可以试试将A线程的优先级设置的低一些
调用setPriority(1-10的优先级)
默认是5,这也只是优先级而已,不一定是A不是第一个,只是增加可能性而已

GreyElaina
用队列(Queue).

1596886225
本帖最后由 1596886225 于 2019-12-21 19:33 编辑

回答的有些乱,总结一下就是
线程的调用顺序是随即无序的,即使你A线程先调用了start(),但是cpu这个时候没有资源,然后这个时候B线程也调用了start(),这个时候AB的顺序就是随机的了,所以,你一直是A第一个只能说是巧合。

3TUSK
XY 问题,楼主的最终目标是什么?

第一页 上一页 下一页 最后一页