完成任务后如何在java中销毁线程

时间:2009-12-03 06:53:11

标签: java multithreading

我正在使用线程池来完成我的任务。完成每项任务后,我正在使用Thread.stop()Thread.destroy()销毁该主题。但在运行我的应用程序(在Eclipse中)大约30分钟后。我得到一个内存越界错误。

请建议我如何杀死线程。

4 个答案:

答案 0 :(得分:14)

如果您正在使用线程池,则不应该终止该线程 - 线程池的重点是重用线程。

如果你不希望重用该线程,那么只需启动一个新线程而不是使用线程池 - 然后让线程死掉,而不是调用stop或destroy。这些方法已经被弃用了 - 基本上不应该调用它们。

现在还不清楚这会导致内存不足的例外情况 - 你有没有理由把重点放在线程上作为可能的原因?

答案 1 :(得分:5)

为了强化@Jon Skeet所说的内容,调用已弃用的Thread.stop()Thread.destroy()方法是一个非常糟糕的想法。

根据javadoc,Thread.destroy()基本上是危险的,从未实施过。最初的想法只是杀死线程并打破其所有的监视器锁定。如果它恰好处于更新共享数据结构的中间,则数据结构将处于不确定状态。等待被杀死的线程通知某个对象的其他线程将等待。

Thread.stop()导致在意外(对于被命中的代码)处引发ThreadDeath异常。它比杀死一个线程更有序,但是除非所有停止的线程(包括它调用的任何东西)都用finally块仔细写入以通知服务员,恢复数据结构等,否则你有相同的问题

有关整个故事,请参阅Java Thread Primitive Deprecation

答案 2 :(得分:4)

任务完成后,线程运行应该返回。什么都不做。这将照顾好事情。

答案 3 :(得分:0)

在调试模式下,垃圾收集器不会清除线程。 尝试运行应用程序而不是在调试模式下运行,一切都应该没问题。