Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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_Executorservice_Executor - Fatal编程技术网

如何在我的Java程序中终止执行器?

如何在我的Java程序中终止执行器?,java,executorservice,executor,Java,Executorservice,Executor,这个问题与我的上一个问题有关: 为了找到问题所在,我仔细查看了我的代码,发现我应用程序中的一些执行器没有终止,因为我正在学习如何使用执行器,我复制了一些在线示例代码并在我的应用程序中使用,我不确定是否正确使用了它们 以下两种使用执行者的方法有什么区别 [1] 现在,当我的程序结束时,它将不再有很多活动线程 在我看来,在第一个任务完成后,执行器仍然有一个活动的线程池在运行并等待更多的任务,它们确实会消耗cpu时间和内存 不完全是。在第一种方法中,在所有任务完成后(如锁存器发出的信号),执行器肯定不

这个问题与我的上一个问题有关:

为了找到问题所在,我仔细查看了我的代码,发现我应用程序中的一些执行器没有终止,因为我正在学习如何使用执行器,我复制了一些在线示例代码并在我的应用程序中使用,我不确定是否正确使用了它们

以下两种使用执行者的方法有什么区别

[1]

现在,当我的程序结束时,它将不再有很多活动线程

在我看来,在第一个任务完成后,执行器仍然有一个活动的线程池在运行并等待更多的任务,它们确实会消耗cpu时间和内存

不完全是。在第一种方法中,在所有任务完成后(如锁存器发出的信号),执行器肯定不会关闭——但执行器中的线程不会消耗cpu(它们消耗的是它们的结构所需的最小内存)

在这种方法中,您可以明确地控制任务何时以及如何完成。您可以知道任务是成功还是失败,并可以根据需要决定重新提交任务

第二个将在shutdown()方法运行后终止池中的所有活动线程,并且所有以前活动的线程在该点之后不会占用更多的cpu时间或内存

同样,不完全如此。在这种方法中,ExecutorService不会在调用
shutdown()
后立即关闭。它等待已提交的任务完成,但在这里,您无法直接知道这些任务是成功完成还是失败(通过抛出一些
异常

在已经提交的任务完成之前,您的
isShutDown()
将执行一个紧密循环(它将使cpu峰值接近100%)

在我看来,在第一个任务完成后,执行器仍然有一个活动的线程池在运行并等待更多的任务,它们确实会消耗cpu时间和内存

不完全是。在第一种方法中,在所有任务完成后(如锁存器发出的信号),执行器肯定不会关闭——但执行器中的线程不会消耗cpu(它们消耗的是它们的结构所需的最小内存)

在这种方法中,您可以明确地控制任务何时以及如何完成。您可以知道任务是成功还是失败,并可以根据需要决定重新提交任务

第二个将在shutdown()方法运行后终止池中的所有活动线程,并且所有以前活动的线程在该点之后不会占用更多的cpu时间或内存

同样,不完全如此。在这种方法中,ExecutorService不会在调用
shutdown()
后立即关闭。它等待已提交的任务完成,但在这里,您无法直接知道这些任务是成功完成还是失败(通过抛出一些
异常

在已经提交的任务完成之前,您的
isShutDown()
将执行一个紧密循环(它将使cpu峰值接近100%)。

线程池(ExecutorService)通常不应定期创建/销毁。相反,它们应该是长寿命的(可能是应用程序的整个生命周期),以避免线程创建/销毁的(显著)开销

如果要提交任务列表并等待所有任务完成,请使用而不是尝试通过倒计时闩锁跟踪完成情况

ExecutorService接口提供了两种关闭机制:和。第一个简单地停止接受新作业,并在当前正在执行且已提交的工作完成时停止线程。第二个将尝试中断所有正在进行的工作,甚至不会处理已提交但尚未启动的作业。

通常不应定期创建/销毁线程池(ExecutorService)。相反,它们应该是长寿命的(可能是应用程序的整个生命周期),以避免线程创建/销毁的(显著)开销

如果要提交任务列表并等待所有任务完成,请使用而不是尝试通过倒计时闩锁跟踪完成情况


ExecutorService接口提供了两种关闭机制:和。第一个简单地停止接受新作业,并在当前正在执行且已提交的工作完成时停止线程。第二个将尝试中断所有正在进行的工作,甚至不会处理已提交但尚未开始的作业。

第二个问题的答案是什么?好吧-只需使用
ExecutorService
代替普通
Executor
。或者简单地将其强制转换为
ExecutorService
,这肯定会成功,因为调用
Executors.newFixedThreadPool(30)
始终返回
执行器服务的实例。第二个问题的答案是什么?好的-只需使用
执行器服务
代替普通的
执行器
。或者简单地将其强制转换为
ExecutorService
,这肯定会成功,因为调用
Executors.newFixedThreadPool(30)始终返回执行器服务的实例。
 Executor executor=Executors.newFixedThreadPool(30);
 CountDownLatch doneSignal=new CountDownLatch(280);

 for (int N=0;N<280;N++)
 {
   ...
   executor.execute(new SampleCountRunner(doneSignal,...));
 }
 try { doneSignal.await(); }
 catch (Exception e) { e.printStackTrace(); }
ExecutorService executor=Executors.newFixedThreadPool(30);

for (int i=0;i<60;i++)
{
  ...
  executor.execute(new xyzRunner(...));
}
executor.shutdown();

while (!executor.isTerminated()) { }
   executor.shutdown();
   while (!executor.isTerminated()) { }