速率限制执行器中的线程数(Java)
如何限制速率限制执行器中的线程数(Java),java,multithreading,executorservice,threadpoolexecutor,Java,Multithreading,Executorservice,Threadpoolexecutor,如何限制执行器中执行的线程数?例如,在下面的代码中: executor = Executors.newFixedThreadPool(this.noOfThreads); for (int i = 0; i < sections.size(); i++) { DomNode section = sections.get(i); // Retrieve the url of the
执行器中执行的线程数?例如,在下面的代码中:
executor = Executors.newFixedThreadPool(this.noOfThreads);
for (int i = 0; i < sections.size(); i++) {
DomNode section = sections.get(i);
// Retrieve the url of the subsection
String subsectionUrl = section.getNodeValue();
if(i != 0 && (i % noOfThreadsPerSection == 0)) {
// Add section threads to the executor
executor.execute(new BrowseSection(filter, webClient, subsectionUrl));
} else {
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
// We should normally never get here
}
}
}
executor=Executors.newFixedThreadPool(this.noOfThreads);
对于(int i=0;i
调用executor.execute()
时,如果线程池中充满了正在运行的线程,会发生什么情况
上面的代码不检查执行器中是否仍在运行线程,而是检查已启动的线程数 在java文档中,newFixedThreadPool有一个无限队列,因此所有其他线程都将等待:
创建一个线程池,该线程池重用固定数量的操作线程
离开共享的无界队列。在任何时候,最多读取个线程
将是活动的处理任务。如果提交了其他任务
当所有线程都处于活动状态时,它们将在队列中等待,直到
线程是可用的。如果任何线程在运行期间由于故障而终止
在关闭前执行,如果需要,将替换一个新的
执行后续任务。池中的线程将一直存在到
它是显式关闭的
无论是否有任何事情要做,池都会创建固定数量的线程。它不会因你如何使用而改变
作业被传递到队列,线程池从队列中获取任务。当池不是很忙时,任务几乎一添加就从队列中删除。任务越多,队列就越长
在Java8中,它避免为每个项目创建任务,而是将工作分解为多个部分。这样,它可以比简单地使用ExecutorService更有效
在Java8中,您可以编写
sections.parallelStream()
.map(s -> s.getNodeValue())
.forEach(s -> new BrowseSection(filter, webClient, s).run());
无需启动线程池,然后再次关闭线程池等。这将等待所有任务完成
您可以通过在命令行上设置来更改的大小
-Djava.util.concurrent.ForkJoinPool.common.parallelism=N
如果您在加载此类之前进行设置,您也可以实际地进行设置。Executors&ExecutorService
不提供用于控制任务队列大小的API,默认情况下,任务队列大小是无限制的
如果任务的时间间隔较短,可以使用ExecutorService
首选,它提供了更好的TaskQueueSize控制、拒绝处理机制
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
有关更多详细信息,请查看以下SE问题:
在您的示例中,线程的数量受此.noOfThreads的限制。它永远不会大于thisnoOfThreads是在给定时间运行的一批线程的大小(前提是有更多的节)。但是如果节数大于此.noOfThreads,并且线程仍然没有完成执行,那么当达到if时会发生什么?执行器是否等待某些线程完成?您可以阅读有关ThreadPoolExecutor的更多信息:任务排队,等待线程完成ready@J谢谢。但是,是否有可能在执行器中填充一个新线程,而不是整个批。noOfThreads?最后一个参数subsectionUrl不应该被替换为s.@Sebi确实,我现在已经修复了它。另外,执行器是如何发挥作用的?这段代码为s中的每个条目创建一个线程,我想限制它,为应用程序使用的线程数设置一个上限。如何通过lambda表达式控制线程数?@Sebi使用机器上所有CPU的缺点是什么。我设计这样的系统是为了使用有限的线程池,但我怀疑在这种情况下不需要这种级别的控制。
setCorePoolSize(newLimit)