Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
任务完成后如何销毁java中的线程_Java_Multithreading - Fatal编程技术网

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

任务完成后如何销毁java中的线程,java,multithreading,Java,Multithreading,我正在使用线程池执行任务。完成每个任务后,我将使用thread.stop()和thread.destroy()销毁线程。但是在运行我的应用程序(在Eclipse中)大约30分钟后,我得到了一个内存越界错误 请建议我如何终止线程。如果您使用的是线程池,那么您不应该一开始就终止线程-线程池的关键是重用线程 如果您不想重用线程,那么只需启动一个新线程,而不是使用线程池——让线程死掉,而不是调用stop或destroy。这些方法被弃用是有充分理由的——它们基本上不应该被调用 不过,目前还不清楚这将如何导

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


请建议我如何终止线程。

如果您使用的是线程池,那么您不应该一开始就终止线程-线程池的关键是重用线程

如果您不想重用线程,那么只需启动一个新线程,而不是使用线程池——让线程死掉,而不是调用stop或destroy。这些方法被弃用是有充分理由的——它们基本上不应该被调用


不过,目前还不清楚这将如何导致内存不足异常-是否有任何理由将线程作为可能的原因?当任务完成时,线程运行应该会返回。别再做什么了。这将解决问题。

为了加强@Jon Skeet所说的,调用不推荐使用的
Thread.stop()
Thread.destroy()方法是一个非常糟糕的主意

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

Thread.stop()
导致ThreadDeath异常在意外(被命中的代码)位置引发。这比终止一个线程要有序一点,但除非所有停止的线程(包括它调用的任何东西)都是用
finally
块仔细编写的,以通知等待者、恢复数据结构等,否则您也会遇到同样的问题


请参阅以了解整个情况。

在调试模式下,线程不会被垃圾收集器清除。
尝试运行应用程序,而不是在调试模式下运行,一切都会好起来。

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