Java 为什么线程在“中”;“开始”;方法是否已在以下上下文中放置为等待?
我正在学习ApacheProcrun教程,遇到了服务的start和stop方法的以下实现Java 为什么线程在“中”;“开始”;方法是否已在以下上下文中放置为等待?,java,multithreading,thread-safety,wait,procrun,Java,Multithreading,Thread Safety,Wait,Procrun,我正在学习ApacheProcrun教程,遇到了服务的start和stop方法的以下实现 public static void start(String[] args) { startThread(); synchronized (loggerThread) { try { loggerThread.wait(); } catch (InterruptedException e) { log("'Wait' interrupted: " + e.getMessage())
public static void start(String[] args) {
startThread();
synchronized (loggerThread) {
try {
loggerThread.wait();
} catch (InterruptedException e) {
log("'Wait' interrupted: " + e.getMessage());
}
}
}
public static void stop(String[] args) {
if (loggerThread != null) {
log("Stopping the thread");
loggerThread.interrupt();
synchronized (loggerThread) {
loggerThread.notify();
}
} else {
log("No thread to interrupt");
}
}
private static void startThread() {
log("Starting the thread");
loggerThread = new Thread(new RandomLoggerService());
loggerThread.start();
}
当调用start方法时,它调用“startThread”方法,该方法将创建一个新线程,其“run”方法实现中的任何内容都将开始执行。但是为什么“loggerThread”是同步的,为什么要等待呢?当我调用stop方法时,它应该立即通知wait-in-start方法。那么,为什么执行逻辑会被stop方法再次移交给start方法呢?这有点令人困惑,请注意。如果我们有一个调用
start()
的线程T1,它将创建一个T2线程,并通过startThread()
启动它T1现在获取loggerThread
对象上的锁/监视器,并对其调用wait()
。这将使T1暂停并等待日志线程的监视器上的任何通知。如果另一个线程(T2或任何其他线程)调用loggerThread.notify()
它将再次唤醒T1,以便继续
因此,需要明确的是,T1并不能控制T2发生的事情,相反的情况更多。然而,这是你不应该触及的东西,因为同步可以用更好(更清晰)的方式完成。这对我来说没有任何意义。顺便说一句,永远不要使用线程作为锁;尤其是千万不要在上面等待/通知——这对我来说就像一个bug。不要使用。在不检查循环中的条件的情况下,决不能等待()。这是因为a)notify()可能会在没有等待的情况下丢失,b)wait()可能会错误地唤醒。