请注意,这不是实际的场景。我根据实际实现创建了一个示例场景,以便于查看。而且我也已经获得了预期的输出。但我需要澄清一些有关java中wait()和notifyall()的概念。[在这里,这两个线程将从主线程中的run方法开始据我所知,由于线程b处于休眠状态,因为在初始阶段可以看到铰孔数是400。
所以线程b会调用 MUTEX.wait()
然后继续休眠,直到其他线程调用notify()或notifyall(),所以在remainingcount减为0之后,线程将调用 MUTEX.notifyAll();
唤醒线b和 MUTEX.wait()
释放它已经被授予的锁并进入睡眠状态,直到线程b通知它 MUTEX.notifyAll()
通过线程a,线程b不会在线程a调用之前唤醒并继续它的任务吗 MUTEX.wait()
.
我的意思是你可以看到线程a调用 MUTEX.notifyAll()
线程b将唤醒并再次检查while循环中的条件是真是假。因此,由于remainingcount等于0,线程b将退出while循环并在线程a调用wait()之前继续它的任务。所以这个场景不会破坏wait()的原理吗?因为据我所知,线程b只能在线程a调用wait()时继续执行。
public class A implements Runnable{
public static volatile remainingCount =400;
private final Object MUTEX;//Both class A and B holds the same object mutex
private void methodA(){
synchronized(MUTEX){
while(remainingCount == 0){
MUTEX.notifyAll();
MUTEX.wait();
}
//Perform it's usual task.In here remaining count will decrement during the process.
}
@Override
public void run() {
while(true){
methodA();
}
}
}
}
public class B implements Runnable{
private final Object MUTEX;//Both class A and B holds the same object mutex
private void methodB(){
synchronized(MUTEX){
while (A.remainingCount != 0) {
try {
MUTEX.wait();
} catch (InterruptedException ex) {
Logger.getLogger(InkServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
}
}
//incrementing the A.remainingCount
MUTEX.notifyAll();
}
@Override
public void run() {
while(true){
methodB();
}
}
}
暂无答案!
目前还没有任何答案,快来回答吧!