如何优雅地结束一个线程?
3个回答
展开全部
首先谢谢邀请
在本文中,我们将讨论结束Java线程的简洁方法,这是必要的,因为Java已经弃用了Thread.stop()方法。
Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit由于一些潜在的线程安全问题, Oracle已弃用 。很少有公认的和广为接受的方法来实现这一点,在本文中,我们将讨论2 个用Java结束线程的方法。
使用标志
中断线程。
1.使用标志
一种简单的方法是使用线程来指示线程是否正在运行,并使用此标志根据您的要求采取纠正措施,下面是一个示例代码,概述了如何使用标志来杀死Java线程。
在上面的例子中。我们可以通过将运行变量设置为false来控制执行。在我们的示例中,我们使用AtomicBoolean了并发,如果您不想使用它(不推荐),您需要确保Boolean您在代码应该是易变的。可以使用 volatile代替他。
2.中断线程
以上代码看起来不错,但在采取上述方法之前需要考虑一些要点
如果我们有很多线程,它将变得更加复杂,我们需要确保使用join()方法完成这些线程。
我们真的需要定义一个布尔标志,因为Java已经使用中断标志提供了这个功能吗?
在这个代码块中有几件非常重要的事情
我们不会吞下异常,而是将其传递给系统,以确保系统根据此异常采取纠正措施
在上面的例子中,我们捕获InterruptedException并立即用于立即 Thread.currentThread().interrupt() 中断我们的线程。这是必需的,因为一旦抛出异常就中断了中断标志,并且如果我们的代码在嵌套循环中运行,它可能会导致一些问题。
总而言之,如果你仍然想要使用标志方法,那么Thread.interrupt()结束java线程的首选/推荐方法是你可能必须等待所有阻塞操作完成才能使用基于标志的逻辑。
文版权归是三僡然所有,转载请标明出处。欢迎转载,欢迎评论,欢迎分享。如果你有文章想分享可以联系我。
在本文中,我们将讨论结束Java线程的简洁方法,这是必要的,因为Java已经弃用了Thread.stop()方法。
Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit由于一些潜在的线程安全问题, Oracle已弃用 。很少有公认的和广为接受的方法来实现这一点,在本文中,我们将讨论2 个用Java结束线程的方法。
使用标志
中断线程。
1.使用标志
一种简单的方法是使用线程来指示线程是否正在运行,并使用此标志根据您的要求采取纠正措施,下面是一个示例代码,概述了如何使用标志来杀死Java线程。
在上面的例子中。我们可以通过将运行变量设置为false来控制执行。在我们的示例中,我们使用AtomicBoolean了并发,如果您不想使用它(不推荐),您需要确保Boolean您在代码应该是易变的。可以使用 volatile代替他。
2.中断线程
以上代码看起来不错,但在采取上述方法之前需要考虑一些要点
如果我们有很多线程,它将变得更加复杂,我们需要确保使用join()方法完成这些线程。
我们真的需要定义一个布尔标志,因为Java已经使用中断标志提供了这个功能吗?
在这个代码块中有几件非常重要的事情
我们不会吞下异常,而是将其传递给系统,以确保系统根据此异常采取纠正措施
在上面的例子中,我们捕获InterruptedException并立即用于立即 Thread.currentThread().interrupt() 中断我们的线程。这是必需的,因为一旦抛出异常就中断了中断标志,并且如果我们的代码在嵌套循环中运行,它可能会导致一些问题。
总而言之,如果你仍然想要使用标志方法,那么Thread.interrupt()结束java线程的首选/推荐方法是你可能必须等待所有阻塞操作完成才能使用基于标志的逻辑。
文版权归是三僡然所有,转载请标明出处。欢迎转载,欢迎评论,欢迎分享。如果你有文章想分享可以联系我。
展开全部
首先,线程需要有信号处理函数,只需要在收到退出信号的时候执行线程清理函数,就是优雅的关闭了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议看一下ThreadPoolExecutor源码对于worker的管理,当queue中获取不到可执行的task(线程循环执行的条件),在对线程数据清理之后,就退出了线程的执行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询