gpt4 book ai didi

java - 并发性 - 为什么这个函数中的最后一条指令永远不会执行?

转载 作者:行者123 更新时间:2023-12-01 15:39:44 27 4
gpt4 key购买 nike

我有这个代码:

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();
}
}

最佳答案

您永远不会将 isDone 设置为 true。此外,您还应该使其 volatile 。您可能应该添加:

@Override
public void letMeKnow() {
isDone = true;
synchronized (synchObj) {
synchObj.notifyAll();
}
}

编辑:如果您只想等待工作线程完成调用:

w.join();

关于java - 并发性 - 为什么这个函数中的最后一条指令永远不会执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8259818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com