有关Java ExecutorService newFixedThreadPool的几个问题

时间:2018-08-26 19:05:05

标签: java executorservice

请注意,我通常会在对该问题进行20次以上的搜索后再问一个问题。但是我还是听不懂。所以我需要你的帮助。

基本上,我不了解depot_id

的确切用法
  1. newFixedThreadPool是否意味着有十个不同的线程?还是意味着它可以有10个相同的线程?还是两者都有? 我使用newFixedThreadPool(10)方法执行了20多次,并且可以正常工作。

  2. submit()是否打印值?还是您将线程放入submit()中?

2 个答案:

答案 0 :(得分:2)

简而言之,任务是可以并行执行的小代码单元(代码段)。执行线程的是线程(在线程池中)。您可以想到像工作者这样的线程,以及像工作这样的任务。工作可以并行完成,而工人可以并行工作。工人从事工作。

因此,回答您的问题:

  1. newFixedThreadPool(int nThreads)创建在相同输入队列上操作的nThread线程池。 nThreads是在任何给定时间可以运行的最大线程数。每个线程可以运行不同的任务。通过您的示例,您可以同时运行10个任务。 (可以通过{hovercraft-full-of-eles归功于here找到该文档)
  2. submit()将给定的任务推入事件队列,该事件队列由线程池中的线程共享。一旦有线程可用,它将从队列的前面获取一个任务并执行它。它不应该打印任何内容,除非您传递的Runnable中包含打印语句。但是,提交任务时,可能不会正确打印打印语句!一旦线程正在执行特定任务,它将打印。 (可以在here中找到文档)

答案 1 :(得分:0)

仅参考java docs或JAVA API的描述,而不是对其进行谷歌搜索。 对于您的问题,我有以下评论。

问题1->

ExecutorService executorService = Executors.newFixedThreadPool(10);

首先,使用Executors newFixedThreadPool()工厂方法创建一个ExecutorService。这将创建一个包含10个执行任务的线程的线程池。

Executors.newFixedThreadPool API创建一个 重用 固定数量的线程的线程池,并且这些线程在无限制的无限队列中工作。 在任何时候,最多nThreads个线程都是活动的处理任务。 如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到某个线程可用为止。 如果在关闭之前执行过程中由于执行失败导致任何线程终止,则在执行后续任务时将使用新线程代替。直到显式关闭之前,池中的线程将一直存在。 甚至提交了20个任务后,它就与此线程池一起工作了。

内部调用下面的代码行。 公共静态ExecutorService newFixedThreadPool(int nThreads){         返回新的ThreadPoolExecutor(nThreads,nThreads,                                       0L,TimeUnit.MILLISECONDS,                                       新的LinkedBlockingQueue());     }

问题2->提交一个Runnable任务以在Queue中执行,它还可以返回表示任务的Future Object类型的Object。我们可以使用Future的get方法检查提交的任务是否已成功完成,因为成功完成后它将返回null。