Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并发性-为什么此函数中的最后一条指令从未执行?_Java_Concurrency - Fatal编程技术网

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在同步块内。