本帖最后由 Shinatobe 于 2019-12-22 08:46 编辑
比如有这么一个代码:
复制代码
虽然 B, C, D 的输出是乱序的,但是似乎 A 总是第一个输出。
有什么办法连 A 的执行也是乱序的呢?在开头加一个什么都不干的 Runnable 可行吗?或者有什么其他比较优雅的做法?
比如有这么一个代码:
- new Thread(一个输出"A"的Runnable).start();
- new Thread(一个输出"B"的Runnable).start();
- new Thread(一个输出"C"的Runnable).start();
- new Thread(一个输出"D"的Runnable).start();
虽然 B, C, D 的输出是乱序的,但是似乎 A 总是第一个输出。
有什么办法连 A 的执行也是乱序的呢?在开头加一个什么都不干的 Runnable 可行吗?或者有什么其他比较优雅的做法?
本帖最后由 xiaolu550 于 2019-12-21 17:53 编辑
操作同一对象,并且该对象被操作的代码加锁
好吧。。上面没对题,上面是按照顺序跑
顺序无关实在没搞明白什么意思
可以让A sleep一会?个人感觉这个问题不太有意义,如果控制线程跑的先后顺序可以考虑CountDownLatch之类的
操作同一对象,并且该对象被操作的代码加锁
好吧。。上面没对题,上面是按照顺序跑
顺序无关实在没搞明白什么意思
可以让A sleep一会?个人感觉这个问题不太有意义,如果控制线程跑的先后顺序可以考虑CountDownLatch之类的
实在搞不懂为什么你一定要这么做
如果一定要连 A 的执行也随机,不妨试试生成随机数,随机挑选 A 到 D 中的任务执行
至于在 A 之前再加一个 Runnable 的做法,除非你这个所谓的空壳 Runnable 能做点什么计算、做到“占着茅坑不拉屎”,否则还是会被后来的 A “挤出厕所”的
如果一定要连 A 的执行也随机,不妨试试生成随机数,随机挑选 A 到 D 中的任务执行
至于在 A 之前再加一个 Runnable 的做法,除非你这个所谓的空壳 Runnable 能做点什么计算、做到“占着茅坑不拉屎”,否则还是会被后来的 A “挤出厕所”的
这样?复制代码
- if((new Random()).nextInt(100)<50){
- new Thread(一个输出"A"的Runnable).start();
- new Thread(一个输出"B"的Runnable).start();
- new Thread(一个输出"C"的Runnable).start();
- new Thread(一个输出"D"的Runnable).start();
- }else{
- new Thread(一个输出"B"的Runnable).start();
- new Thread(一个输出"C"的Runnable).start();
- new Thread(一个输出"D"的Runnable).start();
- new Thread(一个输出"A"的Runnable).start();
- }
这个可能没法实现,线程怎么调用是由线程调度器说了算,开发人员没法决定线程调度器怎么做
只是你运行时总是A第一个,线程的运行顺序应该是无序的,你可以试试将A线程的优先级设置的低一些
调用setPriority(1-10的优先级)
默认是5,这也只是优先级而已,不一定是A不是第一个,只是增加可能性而已
调用setPriority(1-10的优先级)
默认是5,这也只是优先级而已,不一定是A不是第一个,只是增加可能性而已
用队列(Queue).
本帖最后由 1596886225 于 2019-12-21 19:33 编辑
回答的有些乱,总结一下就是
线程的调用顺序是随即无序的,即使你A线程先调用了start(),但是cpu这个时候没有资源,然后这个时候B线程也调用了start(),这个时候AB的顺序就是随机的了,所以,你一直是A第一个只能说是巧合。
回答的有些乱,总结一下就是
线程的调用顺序是随即无序的,即使你A线程先调用了start(),但是cpu这个时候没有资源,然后这个时候B线程也调用了start(),这个时候AB的顺序就是随机的了,所以,你一直是A第一个只能说是巧合。
XY 问题,楼主的最终目标是什么?