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

8

我正在使用线程池处理任务。在每个任务完成后,我使用 Thread.stop()Thread.destroy() 销毁线程。但是运行我的应用程序(在Eclipse中)大约30分钟后,我遇到了内存不足的错误。

请建议如何终止线程。

4个回答

15

如果你正在使用线程池,那么你就不应该在一开始终止线程——线程池的整个意义就在于重用线程。

如果你不想要重用线程,那么只需启动一个新线程而不是使用线程池,并让该线程自然结束,而不是调用stop或destroy方法。这些方法被弃用有其合理的原因——它们基本上不应该被调用。

不过,目前还不清楚这会导致内存溢出异常的原因是什么——你是否有任何理由认为线程是可能的原因呢?


6
为了强调@Jon Skeet所说的,调用已废弃的Thread.stop()Thread.destroy()方法是非常糟糕的想法。
根据javadoc的说明,Thread.destroy()本质上是危险的,从未实现。最初的想法只是杀死线程并打破所有监视器锁定。如果它在更新共享数据结构的中间发生,数据结构将处于不确定状态。等待被杀线程通知某个对象的其他线程将永远等待。 Thread.stop()会在意料之外的地方引发ThreadDeath异常(对于被触发的代码来说)。它比杀死一个线程更有序,但除非所有停止的线程(包括它调用的任何内容)都仔细编写了finally块以通知等待者、恢复数据结构等,否则你就会面临同样的问题。
请参考Java Thread Primitive Deprecation获取完整的故事。

是的,非常危险。我经常开玩笑说,杀死线程的唯一安全方法是使用System.exit()。 - PSpeed

4

任务完成后,线程运行应该返回。不要再做任何事情了。这样就可以处理好事情。


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接