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_Concurrency_Runnable - Fatal编程技术网

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

我需要清理Java中的线程对象吗?,java,multithreading,concurrency,runnable,Java,Multithreading,Concurrency,Runnable,在我的Java应用程序中,我有一个Runnable,例如: this.runner = new Runnable({ @Override public void run() { // do something that takes roughly 5 seconds. } }); 我需要大约每30秒运行一次,尽管在单独的线程中可能会有所不同。代码的本质是我可以运行它,不管它成功还是失败,我都可以忘记它。我在应用程序中以单行代码的形式执行以下操作: (ne

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

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

(new Thread(this.runner)).start()
现在,这个很好用。但是,我想知道在每个线程实例运行完之后,是否应该对它们进行任何类型的清理?我正在用VisualVM对这个应用程序进行CPU评测,我可以看到,在1小时的运行过程中,创建了很多线程。这种担心是正确的还是一切正常


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

我建议您查看并发API。有许多预定义的通用方法。通过使用ExecutorService,您可以在向执行器提交任务后调用shutdown方法,该执行器停止接受新任务,等待以前提交的任务执行,然后终止执行器。 简单介绍一下:
我建议您查看并发API。有许多预定义的通用方法。通过使用ExecutorService,您可以在向执行器提交任务后调用shutdown方法,该执行器停止接受新任务,等待以前提交的任务执行,然后终止执行器。 简单介绍一下:

使用后需要清理或关闭的Java对象通常实现该接口。这使得使用户可以轻松地进行清理。该类不实现AutoCloseable,并且没有close或dispose方法。因此,您不需要进行任何明确的清理

然而

(new Thread(this.runner)).start()
不能保证立即开始Runnable的计算。你可能不在乎它是成功还是失败,但我想你确实在乎它是否运行。并且您可能希望限制并发运行的这些任务的数量。例如,您可能希望一次只运行一个。因此,您可能希望删除线程,或者。连接线程将确保线程完成其计算。通过超时连接线程会增加线程开始计算的可能性,因为当前线程将被挂起,从而释放可能运行另一个线程的CPU

但是,不建议创建多个线程来执行常规或频繁任务。您应该将任务改为一个任务。这将使您能够控制最大并发量,并可以为您提供其他好处,例如优先处理不同的任务,并分期付款

您可以将线程池配置为使用固定长度的有界任务队列,并在队列已满时将线程提交到。通过这样做,您可以保证提交到线程池的任务最终得到执行。它的文档说明了这一点

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


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

使用后需要清理或关闭的Java对象通常实现该接口。这使得使用户可以轻松地进行清理。该类不实现AutoCloseable,并且没有close或dispose方法。因此,您不需要进行任何明确的清理

然而

(new Thread(this.runner)).start()
不能保证立即开始Runnable的计算。你可能不在乎它是成功还是失败,但我想你确实在乎它是否运行。并且您可能希望限制并发运行的这些任务的数量。例如,您可能希望一次只运行一个。因此,您可能希望删除线程,或者。连接线程将确保线程完成其计算。通过超时连接线程会增加线程开始计算的可能性,因为当前线程将被挂起,从而释放可能运行另一个线程的CPU

但是,不建议创建多个线程来执行常规或频繁任务。您应该将任务改为一个任务。这将使您能够控制最大并发量,并可以为您提供其他好处,例如优先处理不同的任务,并分期付款

您可以将线程池配置为使用固定长度的有界任务队列,并在队列已满时将线程提交到。通过这样做,您可以保证提交到线程池的任务最终得到执行。它的文档说明了这一点

有时执行给定的任务 将来


这表明,即使您不执行这些特定任务以确保已提交的任务得到执行,实现也会保证最终运行所有已提交的任务。

我建议查看ScheduledThreadPoolExecutor池及其scheduleAtFixedRate方法。通过这种方式,您不必手动处理线程并让池为您管理线程。我建议您查看ScheduledThreadPoolExecutor池及其scheduleAtFixedRate方法。这样,您就不必手动处理线程,让池为您管理线程。另一个问题-如果它是一个对延迟敏感的应用程序,我需要立即运行线程,那么线程池是正确的方法吗?如果您确实需要现在运行某个线程,唯一可靠的方法是在当前线程中自己运行它,因为您不能保证有另一个CPU与当前线程同时运行任务。让我重新格式化。如果我的愿望/要求是确保Runnable尽可能快地执行,那么如何在不阻塞主线程的情况下在单独的线程中运行Runnable?我应该使用ExecutorService还是只使用新线程。。还是其他方法?谢谢,越快越好太模糊了。很多事情都是可能的。这取决于你愿意付出多少努力。尽快地,我不是你张贴的问题的一部分;你应该问一个不同的问题,如果你对此感兴趣。@ABC,如果你将任务提交到一个池中而不是创建一个新线程,任务通常会执行得更快。线程的创建和销毁是昂贵的。这就是线程池的全部意义——通过重复使用线程来避免这种开销。另一个问题——如果它是一个对延迟敏感的应用程序,并且我现在需要运行线程,那么线程池是正确的方法吗?如果你真的需要现在运行某个东西,唯一可靠的方法就是在当前线程中自己运行它,因为您不能保证有另一个CPU与当前线程同时运行任务。让我重新格式化。如果我的愿望/要求是确保Runnable尽可能快地执行,那么如何在不阻塞主线程的情况下在单独的线程中运行Runnable?我应该使用ExecutorService还是只使用新线程。。还是其他方法?谢谢,越快越好太模糊了。很多事情都是可能的。这取决于你愿意付出多少努力。尽快地,我不是你张贴的问题的一部分;你应该问一个不同的问题,如果你对此感兴趣。@ABC,如果你将任务提交到一个池中而不是创建一个新线程,任务通常会执行得更快。线程的创建和销毁是昂贵的。这就是线程池的全部意义——通过重用线程来避免这种开销。