最赞回答 / 正方形企鹅
声明:解释转自 sxian_wang 的回答先明白两个概念:锁池和等待池。synchronized是锁池,wait、notify、notifyAll是等待池。等待池的对象是不会竞争锁的,当notifyAll后,等待池中的线程会被唤醒进入到该线程的锁池中重新竞争对象锁,重新获得锁后的对象会从wait后继续执行代码,其他对象会被阻塞,而不是wait。被阻塞的对象会等待下一次被唤醒(notify、notifyAll)。另外,notify不是线程安全的,notifyAll才是。
2017-07-06
最赞回答 / 我梦寐以求是真爱与自由
Thread.sleep(50)的作用是让stage()这个线程休眠五十毫秒,写在Thread.sleep(50)后面的就是终止条件,表面来看整个逻辑确实很奇怪,因为你发现一整套下来线程跑的次数比你想象中的多的多。而真正让线...
2017-07-04
最赞回答 / KingAmo
其他线程在他的start()方法执行后,并没有立即获得cpu时间,所以里面的run()方法没有立即执行,等到stage线程让出cpu时间后才会执行。但是你没休眠,stage线程会执行到赋值keeprunning为false,stage线程这时让出cpu时间,其他线程再试行,但已经不会打印输出语句了。如果你有休眠,stage线程执行到休眠时就让出了cpu时间,后面的给keeprunning赋值没有执行,所以可以打印、
2017-07-03
最赞回答 / 慕婉清0689395
因为ArmyRunable类继承了runnable接口,而且thread中有一个构造方法可以通过runnable对象去实例化一个thread对象,所以我们可以用ArmyRunnable类去进行父类引用子类对象去实例化一个runnable对象,最后得到thread对象当然可以调用Thread.CurrentThread 方法和yield() 方法啊。
2017-06-08
最新回答 / Mad_Man_
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;了...
2017-05-02