在ThreadPoolExector#关闭的留档中,它说:
此方法不会等待以前提交的任务完成执行
那是什么意思?
因为我认为这意味着已经提交的排队任务可能无法完成,但事实并非如此;请参阅以下示例代码,该代码在启动所有提交的任务之前调用shutdown:
package example;
import java.util.concurrent.*;
public class ExecutorTest {
public static void main(String ... args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int count = i;
executorService.execute(() -> {
System.out.println("starting " + count);
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
System.out.println("interrupted " + count);
}
System.out.println("ended " + count);
});
}
executorService.shutdown();
}
}
其中打印:
C:\>java -cp . example.ExecutorTest
starting 0
starting 2
starting 1
ended 2
ended 0
starting 3
starting 4
ended 1
starting 5
ended 3
ended 5
ended 4
starting 7
starting 6
starting 8
ended 7
ended 6
ended 8
starting 9
ended 9
C:\>
在这个例子中,很明显提交的任务是完全执行的。我在JDK8上用Oracle和IBMJDK运行了这个,得到了同样的结果。
那么文档中的这一行想说什么呢?还是有人为shutdownNow写了这篇文章,并无意中将其剪切粘贴到文档中以便关机?
关闭()
的javadoc的完整引用:
启动有序关闭,执行之前提交的任务,但不接受新任务。如果已经关闭,调用没有额外效果。
此方法不会等待以前提交的任务完成执行。使用Wait Termination(等待终止)来执行此操作。
关闭执行程序可防止提交新任务。
已提交的任务(无论是已启动还是仍在队列中等待)将完成执行。
如果不想执行排队的任务,请调用shutdownNow():
尝试停止所有正在执行的任务,停止正在等待的任务的处理,并返回正在等待执行的任务的列表。从该方法返回时,这些任务将从任务队列中排出(删除)。
此方法不会等待正在执行的任务终止。使用waitTershtml" target="_blank">ion
来执行此操作。
除了尽最大努力尝试停止处理正在积极执行的任务之外,没有其他保证。此实现通过线程取消任务。中断(),因此任何无法响应中断的任务都可能永远不会终止。
已启动的任务是否停止取决于任务,如最后一段所述。
在ThreadPoolExector#关闭
的文档中,还有一句话:
此方法不等待先前提交的任务完成执行。使用waitTersion来做到这一点。
在这种情况下,这意味着调用方线程不会等待以前提交的任务完成执行。换句话说,shutdown()不会阻止调用线程。
如果确实需要阻止调用线程,请使用ThreadPoolExector#awaitTermination(长超时,时间单位):
阻塞,直到所有任务在关闭请求后完成执行,或超时发生,或当前线程中断,以先发生的为准。
我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因
问题内容: 这是我的代码段。 现在做完之后 我要在这里实现的是,我要等待线程池中的所有线程完成执行,然后关闭执行器。 但是我想这不是这里正在发生的事情。主线程似乎正在执行关闭,它只是关闭了所有内容。 在我的线程池大小为2之前,我做了以下事情,而且似乎可行。 我如何在线程池中使用更多线程?谢谢。 问题答案: 您通常使用以下成语: 只是说执行者不会接受新工作。 等待直到所有已提交的任务完成它们的工作(
目前,我正在使用一个围绕脚本共享的执行器服务的全局实例。我的想法是调用并将任务添加到池中,以便线程进行工作,当所有线程都完成时,然后写入输出文件以获取结果。 下面是一个小视图:主线程调用t0、t1、t2、t3,t0调用t4、t5。其他线程也可以调用其他线程。 问题是shutdown()和awaitTermination()在t0、t1、t2、t3时被调用并完成,而没有等待t4和t5。因此,当t4和
根据ThreadPoolExecutor文档(Java ThreadPoolExecutor),如果我像这样创建一个executor服务: 当#线程
我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:- > 如果有理想的线程,并且随着任务的到来,将该任务分配到队列中,而不是将其添加到队列中。 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中 我已经重写了线程池执行程序的java 1.5版本的执行方法。 新守则如下:- 遗留代码如下所示:- 现在正
Java SE6文档中的ThreadPoolExecutor类具有以下方法: 返回正在积极执行任务的线程的大致数目。 这里近似和积极执行是什么意思? 在调用之前、期间和之后,是否保证 null 我已经研究了线程池执行器监视需求,以及如何在java中判断线程池中是否有可用的线程,但它们没有回答我的查询。