关闭一个运行的线程

时间:2013-02-10 10:37:06

标签: java multithreading shutdown

假设在我跑步期间,我想优先关闭单个线程

由于不安全的行为,我不想使用Thread.stop()Thread.destroy()

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

4 个答案:

答案 0 :(得分: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()的作用相同,只是中断的标志被重置。因为它是你的主题,所以没关系。

答案 1 :(得分:1)

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

  • 如果线程正在循环,您可以通过引发一个标志来停止它(根据循环的条件进行检查)。
  • 如果线程正在等待Socket或任何其他流,请关闭该流。
  • 如果线程在可以抛出InterruptedException的调用中被阻止,则可以interrupt()线程并忽略该异常。
  • 如果线程正在使用阻塞队列的元素,请使用 poison pill 方法,这意味着在队列中添加一个只是意味着“停止循环”的元素。

答案 2 :(得分:1)

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

You can take a look at this question for some more detailed answers

答案 3 :(得分:0)

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

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