gpt4 book ai didi

java - 为什么指定了 wait 后,lock wait 下面的行仍被执行?

转载 作者:行者123 更新时间:2023-12-01 10:37:12 30 4
gpt4 key购买 nike

我编写了以下代码,其中 start 方法应该等待,直到 stop 方法通知它。但是在执行过程中,尽管我已指定它等待,但启动方法下面的日志行会被打印。下图是我的start方法实现如下。

private static boolean stopThread = false;

public static void start(String[] args) {
startThread();
synchronized (serviceThread) {
try {
while(stopThread) {
serviceThread.wait();
}
LOGGER.log(Level.INFO, "Thread: Just after wait method");

} catch (InterruptedException e) {
LOGGER.log(Level.INFO, "'Wait' interrupted: " + e.getMessage());
}
}
}

下面显示的是我的停止方法实现。

public static void stop(String[] args) {

if (serviceThread != null) {
LOGGER.log(Level.INFO, "Stopping the thread");
serviceThread.interrupt();
LOGGER.log(Level.INFO, "Thread: Successfully interrupted");
synchronized (serviceThread) {
LOGGER.log(Level.INFO, "About to notify");
serviceThread.notify();
stopThread = true;
}
stopPlugins();
kubeLogManager.closeLogger();
messageBus.terminateMessageBus();
System.exit(0);
} else {
LOGGER.log(Level.INFO, "No thread to interrupt");
}
}

为什么在调用 stop 方法之前就打印 wait 方法下面的日志行?请指教。

最佳答案

请参阅 Object.wait 的文档:

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()

interrupts and spurious wakeups are possible, and this method should always be used in a loop:

 synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}

您应该使用一个变量来指示何时调用 stop(),并在调用 notify() 之前设置它。另外,使用 notifyAll() 更安全,因为如果您以某种方式让另一个线程等待该对象,它仍然可以工作。

关于java - 为什么指定了 wait 后,lock wait 下面的行仍被执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34603821/

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