Java 并发性-为什么此函数中的最后一条指令从未执行?
我有以下代码:Java 并发性-为什么此函数中的最后一条指令从未执行?,java,concurrency,Java,Concurrency,我有以下代码: private void doSomething() throws InterruptedException { WorkerThread w= new WorkerThread(this); w.start(); synchronized (synchObj) { while (!isDone) { synchObj.wait(); } } System.out.println("E
private void doSomething() throws InterruptedException {
WorkerThread w= new WorkerThread(this);
w.start();
synchronized (synchObj) {
while (!isDone) {
synchObj.wait();
}
}
System.out.println("End");
}
其中,调用类实现了一个方法,该方法在WorkerThread
实例完成时调用synchObj
上的notifyAll()。除了对System.out.println(“End”)的最后一次调用之外,所有的工作都与预期的差不多代码>从未被调用。为什么呢
编辑:以下是代码的其余部分:
public class App implements Notifee {
private boolean isDone = false;
private final Object synchObj = new Object();
/**
* @param args
*/
public static void main(String[] args) {
App app = new App();
for (int i = 0; i < 5; i++) {
try {
app.doSomething();
} catch (InterruptedException e) {
System.err.println("Didn't even start");
e.printStackTrace();
}
}
}
private void doSomething() throws InterruptedException {
WorkerThread w= new WorkerThread(this);
w.start();
synchronized (synchObj) {
while (!isDone) {
synchObj.wait();
}
}
System.out.println("End");
}
@Override
public void letMeKnow() {
synchronized (synchObj) {
synchObj.notifyAll();
}
}
}
public class WorkerThread extends Thread {
private Notifee n;
public WorkerThread(Notifee n){
this.n = n;
}
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
n.letMeKnow();
}
}
公共类应用程序实现Notifee{
私有布尔isDone=false;
私有最终对象synchObj=新对象();
/**
*@param args
*/
公共静态void main(字符串[]args){
App App=新App();
对于(int i=0;i<5;i++){
试一试{
app.doSomething();
}捕捉(中断异常e){
System.err.println(“甚至没有启动”);
e、 printStackTrace();
}
}
}
private void doSomething()引发InterruptedException{
WorkerThread w=新的WorkerThread(此);
w、 start();
已同步(synchObj){
而(!isDone){
synchObj.wait();
}
}
系统输出打印项次(“结束”);
}
@凌驾
公共空间让我知道(){
已同步(synchObj){
synchObj.notifyAll();
}
}
}
公共类WorkerThread扩展线程{
私人Notifeen;
公共WorkerThread(Notifee n){
这个,n=n;
}
@凌驾
公开募捐{
试一试{
睡眠(500);
}捕捉(中断异常e){
e、 printStackTrace();
}
n、 让我知道();
}
}
您从未将isDone
设置为true
。此外,还应使其易失性
。您可能应该添加:
@Override
public void letMeKnow() {
isDone = true;
synchronized (synchObj) {
synchObj.notifyAll();
}
}
编辑:如果只想等待工作线程完成调用:
w.join();
您是否更改过isDone的值?您是否从任何地方调用synchObj.notify()?只有在最后一行实际抛出InterruptedException时才可能不执行。您的程序是否正确终止?我怀疑您的同步语句可能出现死锁while()
的原因是wait()
可能会出现虚假的唤醒,因此循环可以降低这种风险。为什么volatile
?虚假唤醒使得循环成为必要。无论如何,在这种情况下使用if
通常被认为是一个非常糟糕的主意。谢谢。愚蠢的疏忽。我想要的是主线程等待WorkerThread完成。显然,它没有这样做。你能知道我做错了什么吗?好的,我删除了if的建议@约翰尼:只要调用w.join()就行了。我会移动isDone=true代码>在同步块内。