我正在使用线程池处理任务。在每个任务完成后,我使用 Thread.stop()
和 Thread.destroy()
销毁线程。但是运行我的应用程序(在Eclipse中)大约30分钟后,我遇到了内存不足的错误。
请建议如何终止线程。
我正在使用线程池处理任务。在每个任务完成后,我使用 Thread.stop()
和 Thread.destroy()
销毁线程。但是运行我的应用程序(在Eclipse中)大约30分钟后,我遇到了内存不足的错误。
请建议如何终止线程。
如果你正在使用线程池,那么你就不应该在一开始终止线程——线程池的整个意义就在于重用线程。
如果你不想要重用线程,那么只需启动一个新线程而不是使用线程池,并让该线程自然结束,而不是调用stop或destroy方法。这些方法被弃用有其合理的原因——它们基本上不应该被调用。
不过,目前还不清楚这会导致内存溢出异常的原因是什么——你是否有任何理由认为线程是可能的原因呢?
Thread.stop()
或Thread.destroy()
方法是非常糟糕的想法。Thread.destroy()
本质上是危险的,从未实现。最初的想法只是杀死线程并打破所有监视器锁定。如果它在更新共享数据结构的中间发生,数据结构将处于不确定状态。等待被杀线程通知某个对象的其他线程将永远等待。
Thread.stop()
会在意料之外的地方引发ThreadDeath异常(对于被触发的代码来说)。它比杀死一个线程更有序,但除非所有停止的线程(包括它调用的任何内容)都仔细编写了finally
块以通知等待者、恢复数据结构等,否则你就会面临同样的问题。任务完成后,线程运行应该返回。不要再做任何事情了。这样就可以处理好事情。
在调试模式下,线程不会被垃圾回收器清除。 尝试运行应用程序而不是在调试模式下运行,一切都应该没问题。