如何在我的Java程序中终止执行器?
这个问题与我的上一个问题有关: 为了找到问题所在,我仔细查看了我的代码,发现我应用程序中的一些执行器没有终止,因为我正在学习如何使用执行器,我复制了一些在线示例代码并在我的应用程序中使用,我不确定是否正确使用了它们 以下两种使用执行者的方法有什么区别 [1] 现在,当我的程序结束时,它将不再有很多活动线程 在我看来,在第一个任务完成后,执行器仍然有一个活动的线程池在运行并等待更多的任务,它们确实会消耗cpu时间和内存 不完全是。在第一种方法中,在所有任务完成后(如锁存器发出的信号),执行器肯定不会关闭——但执行器中的线程不会消耗cpu(它们消耗的是它们的结构所需的最小内存) 在这种方法中,您可以明确地控制任务何时以及如何完成。您可以知道任务是成功还是失败,并可以根据需要决定重新提交任务 第二个将在shutdown()方法运行后终止池中的所有活动线程,并且所有以前活动的线程在该点之后不会占用更多的cpu时间或内存 同样,不完全如此。在这种方法中,ExecutorService不会在调用如何在我的Java程序中终止执行器?,java,executorservice,executor,Java,Executorservice,Executor,这个问题与我的上一个问题有关: 为了找到问题所在,我仔细查看了我的代码,发现我应用程序中的一些执行器没有终止,因为我正在学习如何使用执行器,我复制了一些在线示例代码并在我的应用程序中使用,我不确定是否正确使用了它们 以下两种使用执行者的方法有什么区别 [1] 现在,当我的程序结束时,它将不再有很多活动线程 在我看来,在第一个任务完成后,执行器仍然有一个活动的线程池在运行并等待更多的任务,它们确实会消耗cpu时间和内存 不完全是。在第一种方法中,在所有任务完成后(如锁存器发出的信号),执行器肯定不
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()) { }