2

假设在我运行期间我想优雅地关闭一个线程!

我不想使用Thread.stop()也不Thread.destroy()因为他们的不安全行为。

注意:我熟悉使用ExecutorService.shutdown()选项。但我想知道另一种实现方式。

4

4 回答 4

4

停止线程的标准方法是调用thread.interrupt();. 为了让它工作,你需要确保你的线程响应中断,例如:

Thread t = new Thread(new Runnable() { public void run {
    while(!Thread.currentThread().isInterrupted()) {
        //your code here
    }
}});
t.start();
t.interrupt();

这仅在定期检查条件时才有效。请注意,您可以将中断机制委托给可中断的方法(通常是 I/O、阻塞队列、睡眠/等待提供可以阻塞直到被中断的方法)。

注意:在此示例中,您还可以使用:

    while(!interrupted()) {
        //your code here
    }

interrupted()Thread.currentThread().isInterrupted()除了中断标志被重置之外,它做同样的事情。因为它是你的线程,所以没关系。

于 2013-02-10T10:44:05.467 回答
1

run()由于某种原因,您必须使线程的方法终止。如何实现这一点取决于线程的作用

  • 如果线程正在循环,您可以通过引发标志来停止它(通过循环条件检查)。
  • 如果线程正在等待某个Socket流或任何其他流,则只需关闭该流。
  • 如果线程在可以抛出 的调用上被阻塞InterruptedException,您可以interrupt()使用该线程并忽略异常。
  • 如果线程正在消耗阻塞队列的元素,请使用毒丸方法,这意味着将一个元素放入队列中,这意味着“停止循环”。
于 2013-02-10T10:41:06.793 回答
1

你可以isStopped()在你的代码中有标志。并且正在运行的线程应该定期检查这个标志,看它是否应该停止。请注意,优雅地停止线程需要以允许停止的方式编写正在运行的代码。

您可以查看this question以获得更详细的答案

于 2013-02-10T10:42:08.523 回答
0

如果您的run()方法中有一个循环,Thread那么一个选项是您的循环在每次迭代时检查标志的值。

您可以从代码外部设置标志,例如您的线程将在开始下一次迭代之前停止执行。

于 2013-02-10T10:40:21.083 回答