我正在使用线程池来完成我的任务。完成每项任务后,我正在使用Thread.stop()
和Thread.destroy()
销毁该主题。但在运行我的应用程序(在Eclipse中)大约30分钟后。我得到一个内存越界错误。
请建议我如何杀死线程。
答案 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)
在调试模式下,垃圾收集器不会清除线程。 尝试运行应用程序而不是在调试模式下运行,一切都应该没问题。