【发布时间】:2013-11-01 11:45:51
【问题描述】:
public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread{
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
如上例,如果wait()块先进入,ThreadB中后续的notify()会告诉主线程继续。
但是我们不能保证wait()会在notify(之前执行),如果ThreadB先进入block呢? Notify() 将在wait() 之前执行,所以wait() 将永远挂在那里(因为不再有notify() 告诉它继续)?处理这个问题的正确方法通常是什么?
【问题讨论】:
-
您的示例中没有等待或通知...
-
有声音不鼓励使用等待/通知并建议使用例如CyclicBarrier 或CountdownLatch
-
如果有的话。 (?),您可以使用 java.util.concurrent.Semaphore。将'permits'初始化为0,在信号线程中获取(),在信号器线程中释放()。信号量保留计数,因此信号是否在等待之前出现并不重要 - 它将被存储。
-
事实上,有多种可能的解决方案可以满足您的要求。
-
对不起大家!我输入了错误的代码!现在改变了!
标签: java multithreading synchronized