IRVLIN
放到前面就不会停止是指哪个线程不会停止
森森0515
yieId方法只是让当前线程让出cpu,至于几次就随机了。看让出cpu前具体执行了几次就是几次。
森森0515
好吧,因为我忘记实现接口了?
森森0515
慕慕3484187
我也这么觉得,没有体现出实际的意义
我一个不小心
代码中用了yield的方法,该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。但是不确定暂停时间
我爱孙佳怡
让出舞台线程占用的cpu资源,进入sleep状态。使得其余两个线程可以竞争执行代码
人间观察者
不是让给另一个线程操作,是给其他线程一个一起竞争的机会,谁争到就是谁的。
qq_慕丝2035411
舞台的
Thread.sleep(50);
休眠结束之后,执行的
armyTaskOfSuiDynasty.keepRunning = false; armyTaskOfRevolt.keepRunning = false;
来结束对打
volatile boolean keepRunning = true;
要加 volatile。
Rhybood
和上面的冲突了
0独家记忆0
你看是不是把JOIN方法放到了修改keepRunning值得上面
艾米丽宏
其区别主要在于共享数据,Runnable是可以共享数据的,多个Thread可以同时加载一个Runnable,当各自Thread获得CPU时间片的时候开始运行runnable,runnable里面的资源是被共享的。
我是叶霖
首先stage()本身就是一个线程,而在这个线程里又嵌了两个线程。写在Stage.Run()里面的Thread.sleep(50)只是让stage这个线程休眠50毫秒,但是并没有终止它嵌入的两个线程,所以两个军队一直在打,直到stage休眠结束执行到keepRunning = false时,三个线程都结束了,另外如果你把stage里面的Thread.sleep()注释掉你会发现它一次都没执行,我个人理解是线程异步,先编译再执行线程,编译完keepRunning已经是false了,所以不执行。
牙膏牙膏牙膏
run()方法只是一个普通方法,调用run()的话就相当于一个普通方法调用,并没有实现多线程。
而start()方法才是真正启动线程的方法。调用start()后,此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,run()方法运行结束,此线程随即终止。
神亿般的存在
是的。
慕瓜7073846
找一份工作
霸气的少年
线程的名称不能和ArmyRunnable的名称相同啊
霸气的少年
实现了runnable接口的run方法就能多线程
qq_初相遇_0
个人理解:
Thread.currentThread() 获得当前正在运行的线程的引用。
如果是通过继承Thread类实现多线程,则this就是当前正在运行的线程的引用,this.setName()可以直接设置线程的名字。
但如果是实现Runnable接口,类中就没有继承Thread的方法,不能使用this.setName()。
小十页
用来控制线程,让线程里的while结束循环,执行完run方法
沙滩贝壳
把volatile boolean keepRunning = true;放到run方法外面去,作为类rmyRunable的成员变量。谢谢采纳
慕粉0837056082
估计你是想问农民军和隋军的线程运行了多久,这个的话就貌似跟舞台线程的休眠时长有关。Thread.sleep(5)那里。休眠的越久,就战斗的越久,执行到keepRunning = false的时间就越长。反之越短
秦家小小神
public class ArmyRunnable implements Runnable {
//volatile保证了线程可以正确的读取其他线程写入的值
//可见性 JMM,happens-before原则??????????????????????????
volatile boolean keepRunning;//你这里没有赋值,默认是false,当然不会跑
__小七__
Thread.sleep(50)的作用是让stage()这个线程休眠五十毫秒,写在Thread.sleep(50)后面的就是终止条件,表面来看整个逻辑确实很奇怪,因为你发现一整套下来线程跑的次数比你想象中的多的多。而真正让线程跑了那么多的就是这个休眠50毫秒。原因:
Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty, "隋军"); Thread armyOfRevolt = new Thread(armyTaskOfSuiDynasty, "农民起义军"); //启动线程,让军队开始战斗 armyOfSuiDynasty.start(); armyOfRevolt.start();
这里启用了两个线程,而这两个线程是嵌套在stage()这个线程里面的。Thread.sleep(50)只是让stage()休眠了五十毫秒,并没有休眠
armyOfSuiDynasty.start();
armyOfRevolt.start();
而这两个线程在没有遇到keepRunning=false之前是死循环,这个时候Thread.sleep(50)又让stage休眠了50毫秒,在这50毫秒里两军一直在干架,(如果你把时间改成1000,那会执行更多),所以原因差不多就这个吧,其他的也不多说了,你是个聪明人。
桀_小孩丿
其他线程在他的start()方法执行后,并没有立即获得cpu时间,所以里面的run()方法没有立即执行,等到stage线程让出cpu时间后才会执行。但是你没休眠,stage线程会执行到赋值keeprunning为false,stage线程这时让出cpu时间,其他线程再试行,但已经不会打印输出语句了。如果你有休眠,stage线程执行到休眠时就让出了cpu时间,后面的给keeprunning赋值没有执行,所以可以打印、
qq_甲乙丙的丁_0
因为ArmyRunable类继承了runnable接口,而且thread中有一个构造方法可以通过runnable对象去实例化一个thread对象,所以我们可以用ArmyRunnable类去进行父类引用子类对象去实例化一个runnable对象,最后得到thread对象当然可以调用Thread.CurrentThread 方法和yield() 方法啊。
一见我就笑
自己定义的
qq_下个瞬间_03247970
只是显示不同,你的显示是一个包,而视频里的是隔成很多层文件夹显示的
等候稻香
是的,为KeyPersonThread(mrCheng)让出cpu,突出mrCheng的重要性
qq_筑城以北_04274162
mmt.start();
ddt.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
mm.mm=false;
dd.mm=false;
这样就好了,原先可能是你没有让Stage线程休眠,然后程序运行到mmt.start(); ddt.start();后就接着运行mm.mm=false; dd.mm=false;了 所以出现那样的情况,,,,,,,个人见解,,本人 也是新手,,所以建议只供参考