问答详情
源自:2-5 Java线程-隋唐演义实战开发---关键先生

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

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

586d0da9000156dd05000315.jpg

586d0da90001118905000257.jpg



提问者:慕粉2220415365 2017-01-04 22:58

个回答

  • bbug
    2017-01-06 17:21:20
    已采纳

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

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

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

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

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

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

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


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

  • 慕粉2137351520
    2017-05-05 00:03:33

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

  • 飞鱼之吻3377931
    2017-03-09 20:25:15

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

  • 飞行烤鸭
    2017-01-15 23:21:54

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