假设在我运行期间我想优雅地关闭一个线程!
我不想使用Thread.stop()
也不Thread.destroy()
因为他们的不安全行为。
注意:我熟悉使用ExecutorService.shutdown()
选项。但我想知道另一种实现方式。
假设在我运行期间我想优雅地关闭一个线程!
我不想使用Thread.stop()
也不Thread.destroy()
因为他们的不安全行为。
注意:我熟悉使用ExecutorService.shutdown()
选项。但我想知道另一种实现方式。
停止线程的标准方法是调用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()
除了中断标志被重置之外,它做同样的事情。因为它是你的线程,所以没关系。
run()
由于某种原因,您必须使线程的方法终止。如何实现这一点取决于线程的作用。
Socket
流或任何其他流,则只需关闭该流。InterruptedException
,您可以interrupt()
使用该线程并忽略异常。你可以isStopped()
在你的代码中有标志。并且正在运行的线程应该定期检查这个标志,看它是否应该停止。请注意,优雅地停止线程需要以允许停止的方式编写正在运行的代码。
如果您的run()
方法中有一个循环,Thread
那么一个选项是您的循环在每次迭代时检查标志的值。
您可以从代码外部设置标志,例如您的线程将在开始下一次迭代之前停止执行。