在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
我可以看到,在一个小时的运行过程中,有很多线程被创建。这种担心是有效的还是一切正常?
n、 b.我开始工作的原因 new Thread
而不是简单地定义 this.runner
作为一个 Thread
是我有时需要跑步 this.runner
同时两次(在第一次运行调用完成之前),如果我定义了 this.runner
作为一个 Thread
自从单身以来 Thread
对象只能在初始执行完成后再次运行。
2条答案
按热度按时间kkbh8khc1#
我建议您看看并发api。有许多预定义的通用方法。通过使用executorservice,您可以在向执行器提交任务后调用shutdown方法,执行器停止接受新任务,等待以前提交的任务执行,然后终止执行器。简单介绍一下:https://www.baeldung.com/java-executor-service-tutorial
cx6n0qe32#
使用后需要“清理”或“关闭”的java对象通常实现
AutoCloseable
接口。这使得使用try with resources进行清理变得很容易。这个Thread
类未实现AutoCloseable
,并且没有“close”或“dispose”方法。因此,不需要进行任何明确的清理。然而
不能保证立即开始计算
Runnable
. 你可能不在乎它是成功还是失败,但我猜你在乎它是否运行。您可能需要限制并发运行的这些任务的数量。例如,您可能希望一次只运行一个。所以你可能想join()
线程(或者,可能,连接超时)。连接线程将确保线程完成其计算。使用超时连接线程会增加线程开始计算的机会(因为当前线程将被挂起,从而释放可能运行另一个线程的cpu)。但是,不建议创建多个线程来执行常规或频繁的任务。您应该将任务提交到线程池。这将使您能够控制最大并发量,并可以为您提供其他好处(例如优先处理不同的任务),并分摊创建线程的费用。
您可以将线程池配置为使用固定长度(有界)的任务队列,并使提交线程在队列已满时自行执行提交的任务。通过这样做,您可以保证提交到线程池的任务(最终)得到执行。文件
ThreadPool.execute(Runnable)
说的没错在将来某个时候执行给定的任务
这意味着,即使您没有执行那些特定的任务来确保已提交的任务得到执行,实现也会保证最终运行所有已提交的任务。