开发者社区> 问答> 正文

我需要清理Java中的Thread对象吗?

在我的Java应用程序中,我有一个Runnable,例如:

this.runner = new Runnable({ @Override public void run() { // do something that takes roughly 5 seconds. } }); 我需要大约每30秒(尽管这可能有所不同)在单独的线程中运行一次。代码的性质使我可以运行它,而不必理会它(无论成功还是失败)。我在我的应用程序中按以下一行代码进行操作:

(new Thread(this.runner)).start() 我想知道每个线程实例完成运行后是否应该进行某种清理?我正在对该应用程序进行CPU性能分析,VisualVM可以看到在1小时的运行时间过程中,正在创建许多线程。

注意:我之所以启动一个新线程,而不是简单地定义this.runner线程,是我有时需要同时运行this.runner两次(第一次运行调用完成之前),我做不到,如果this.runner定义为一个线程从一个线程对象只能再次运行一次初始执行完成。

展开
收起
小六码奴 2019-10-09 19:16:44 1027 0
1 条回答
写回答
取消 提交回答
  • 使用后需要“清理”或“关闭”的Java对象通常会实现该AutoCloseable接口。这使得使用try-with-resources进行清理变得容易。本Thread类没有实现AutoCloseable,并没有“关闭”或“处理”方法。因此,您无需进行任何显式清理。

    然而

    (new Thread(this.runner)).start() 不能保证立即开始计算Runnable。您可能不在乎它是成功还是失败,但是我想你确实在乎它是否运行。你可能希望限制同时运行的这些任务的数量。例如,你可能只希望一次运行。因此,你可能想要join()使用线程(或者可能需要加入timeout)。加入线程将确保线程将完成其计算。以超时方式加入线程会增加该线程开始其计算的机会(因为当前线程将被挂起,从而释放可能运行另一个线程的CPU)。

    但是,不建议创建多个线程来执行常规或频繁任务。您应该改为将任务提交到线程池。这将使您能够控制最大的并发量,并可以为您带来其他好处(例如,确定不同任务的优先级)。

    您可以将线程池​​配置为使用固定长度(有界)的任务队列,并在队列已满时使提交线程自己执行提交的任务。这样,您可以保证(最终)执行提交给线程池的任务。ThreadPool.execute(Runnable)说的文件

    在将来的某个时间执行给定的任务

    这表明该实现可以保证即使您不执行那些特定任务来确保已执行提交的任务,它也将最终运行所有提交的任务。

    2019-10-09 19:19:11
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载