为了账号安全,请及时绑定邮箱和手机立即绑定

把舞台休眠Thread.sleep(50)去掉后,根本一次都没有调用隋军和农民军作战,这是为什么?

如下图所示,调用的两个线程while循环都没有运行,难度是因为KeepRunning直接为false吗?但是从显示的执行顺序来看,应该false传入是在后面。求解答

586d0da9000156dd05000315.jpg

586d0da90001118905000257.jpg



正在回答

5 回答

java多线程可以近似看成同时执行,不过本质上计算机能同时工作的线程数是有限个的(取决于你的CPU)

老师演示的时候农民军和隋军交替结果看起来应该是至少有两个线程是同时工作的。而你这个明显是仅分配给了这个程序一个线程。

多线程是为了解决某些应用上需要等待其他的结果(比如浏览器访问一个网址需要等待服务器返回HTML文件才能继续执行显示页面的操作)才能继续执行,那么这段时间cpu可以去执行其他线程的程序。但是如果这个线程可以一口气执行下去的话,中途其他线程是没有办法执行的。

-----------------以下是针对代码的--------------------------

你只有一个线程能同时工作。那么两个军队的线程启动后是处于等待状态的,并没有真的执行。

然后舞台线程没有看见sleep(就是你删去的那个)所以继续执行下去,输出,关键人物的生命,设置名字,再一个输出,然后直接就执行到了keeprunning=false的两句。

再之后看见sleep,关键人物线程和两个军队线程争用cpu,不过两个军队线程即使争用到cpu也会因为keeprunning导致线程直接结束,那么舞台线程休眠的时间(这个是确定的值,没到的话再找个线程执行)就只有关键人物有输出操作,关键人物操作以后舞台线程也到了时间的话,舞台线程占用cpu,继续执行。


java初学,为个人理解所得,dalao请轻喷

5 回复 有任何疑惑可以回复我~
#1

bbug 回复 慕粉2220415365 提问者

为什么等待,你电脑太差。你开发个100线程的的程序,那么你需要100核的cpu去执行,如果在算上操作系统这类的,100核的cpu还不够呢。 至于后面执行的代码你没截图到,再往下找是不是有个sleep,这个sleep导致舞台线程暂停,处理器去做其他事情,其他事情那就是两个线程,执行线程就是调用run方法,run方法开始先判断keeprunning,拿到false然后跳出循环,run方法结束。两个线程的run都做完
2017-01-06 回复 有任何疑惑可以回复我~
#2

bbug 回复 慕粉2220415365 提问者

然后没有其他事情可做,cpu就啥也不干,等舞台线程的sleep到时间了然后就关键人物的start,但是也不执行关键人物的线程,毕竟舞台线程没执行完也没被暂停,然后往下看代码,关键人物的join,那么其他所有线程都得等关键人物的线程去执行完再去执行,那么跳到关键人物的线程。等关键人物线程的代码都执行完了再回到舞台线程。
2017-01-06 回复 有任何疑惑可以回复我~
#3

慕粉2220415365 提问者 回复 bbug

谢谢!
2017-01-06 回复 有任何疑惑可以回复我~
查看2条回复

看明白了,总结一下。Stage线程是一个总线程,在运行期间调用两个军队的线程和关键人物的线程,按照Stage总线程的执行顺序,若Stage线程不休眠的话,Stage线程会一直执行下去,两个军队的线程会在Stage线程执行完再进行;在Stage线程执行完前Boolean变量设为false,因此两个军队线程执行时没有输出,关键人物有输出是因为调用了join()方法

0 回复 有任何疑惑可以回复我~

因为你没有将舞台线程休眠,农民和隋军线程开始后,两个线程都处于可运行状态,而舞台线程也是如此,cpu选择线程是随机的(在没有设置优先级时),从你的结果来看,cpu选择了舞台线程,创建了程咬金,并在陈咬金说出:“希望人们安居乐业”后,又选择了农民和隋军进程,即开始打仗,我觉得我讲的是比那个最佳答案好的,你觉得呢

1 回复 有任何疑惑可以回复我~

理论上说都会两个军队进程都会执行完一个while循环吧?

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

把舞台休眠Thread.sleep(50)去掉后,根本一次都没有调用隋军和农民军作战,这是为什么?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信