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

速率限制执行器中的线程数(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)