0

我正在阅读 Apache Procrun 教程,并遇到了服务的启动和停止方法的以下实现。

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 方法时,它应该通知 start 方法中的等待。那么为什么执行逻辑又被 stop 方法交给了 start 方法呢?这有点混乱,请指教。

4

1 回答 1

0

如果我们有一个线程T1调用start()它将创建一个线程T2并通过startThread(). T1现在获取对象上的锁/监视器loggerThread并调用wait()它。这将使T1 “暂停”并等待监视器上的任何通知loggerThread。如果另一个线程(T2或任何其他线程)调用loggerThread.notify()它将再次唤醒T1以便它可以继续。

因此,需要明确的是,T1并没有控制T2发生的事情,而是相反。然而,这是你应该很少接触的东西,因为同步可以以更好(和更清晰)的方式完成。

于 2016-02-08T23:44:19.303 回答