我需要清理java中的线程对象吗?

zpf6vheq  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(289)

在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 对象只能在初始执行完成后再次运行。

kkbh8khc

kkbh8khc1#

我建议您看看并发api。有许多预定义的通用方法。通过使用executorservice,您可以在向执行器提交任务后调用shutdown方法,执行器停止接受新任务,等待以前提交的任务执行,然后终止执行器。简单介绍一下:https://www.baeldung.com/java-executor-service-tutorial

cx6n0qe3

cx6n0qe32#

使用后需要“清理”或“关闭”的java对象通常实现 AutoCloseable 接口。这使得使用try with resources进行清理变得很容易。这个 Thread 类未实现 AutoCloseable ,并且没有“close”或“dispose”方法。因此,不需要进行任何明确的清理。
然而

(new Thread(this.runner)).start()

不能保证立即开始计算 Runnable . 你可能不在乎它是成功还是失败,但我猜你在乎它是否运行。您可能需要限制并发运行的这些任务的数量。例如,您可能希望一次只运行一个。所以你可能想 join() 线程(或者,可能,连接超时)。连接线程将确保线程完成其计算。使用超时连接线程会增加线程开始计算的机会(因为当前线程将被挂起,从而释放可能运行另一个线程的cpu)。
但是,不建议创建多个线程来执行常规或频繁的任务。您应该将任务提交到线程池。这将使您能够控制最大并发量,并可以为您提供其他好处(例如优先处理不同的任务),并分摊创建线程的费用。
您可以将线程池配置为使用固定长度(有界)的任务队列,并使提交线程在队列已满时自行执行提交的任务。通过这样做,您可以保证提交到线程池的任务(最终)得到执行。文件 ThreadPool.execute(Runnable) 说的没错
在将来某个时候执行给定的任务
这意味着,即使您没有执行那些特定的任务来确保已提交的任务得到执行,实现也会保证最终运行所有已提交的任务。

相关问题