Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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_Multithreading_Thread Safety_Wait_Procrun - Fatal编程技术网

Java 为什么线程在“中”;“开始”;方法是否已在以下上下文中放置为等待?

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

我正在学习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 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()可能会错误地唤醒。