请问如何优雅地停止java线程?

如何优雅地停止java线程?

我写了一个线程,它需要太多的时间来执行,而且它似乎还没有完全完成。我想优雅地阻止这条线。有什么帮助吗?


牧羊人nacy
浏览 313回答 3
3回答

FFIVE

使用标志停止线程的坏处在于,如果线程正在等待或处于休眠状态,则必须等待它完成等待/休眠。如果您调用线程上的中断方法,那么这将导致等待或睡眠调用与InterruptedException一起退出。(标志方法的第二个缺点是,大多数非平凡的代码都将使用java.util.current这样的库,其中的类是专门设计用来使用中断来取消的。在传递给Executir的任务中使用手摇标志将很尴尬。)调用中断()还设置一个中断属性,您可以使用该属性作为标志来检查是否退出(在线程没有等待或休眠的情况下)。您可以编写线程的Run方法,以便在线程正在执行的循环逻辑之外捕获InterruptedException,或者在循环中捕获异常并接近抛出异常的调用,为InterruptedException在CATCH块中设置中断标志,这样线程就不会忘记它被中断的事实。中断的线程仍然可以根据自己的条件保持控制和完成处理。假设我想编写一个确实以增量方式工作的工作线程,其中由于某种原因在中间有睡眠,而且我不希望放弃睡眠以使处理退出而不为该增量执行剩余的工作,我只希望它在增量之间的情况下退出:class MyThread extends Thread{     public void run()     {         while (!Thread.currentThread().isInterrupted())         {             doFirstPartOfIncrement();             try {                 Thread.sleep(10000L);             } catch (InterruptedException e) {                 // restore interrupt flag                 Thread.currentThread().interrupt();             }             doSecondPartOfIncrement();         }     }}下面是一个类似问题的答案,包括示例代码。

墨色风雨

你不应该杀其他人的线。这被认为是相当坏的习惯。然而,有许多方法。你可以用return线程的语句run方法。或者,您可以检查线程是否已经被中断,然后它将取消它的工作。F.E.:while (!isInterrupted()) {    // doStuff}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java