在执行程序服务的所有线程正在处理任务时是否可以等待主线程

问题描述 投票:0回答:1

我的场景是将数百万个数据插入后端,目前正在使用执行程序框架来加载此数据。我将用更简单的方式解释我的问题。

在以下情况下,我有10个可运行的线程和3个线程来执行相同的线程。考虑到我的runnable正在执行插入操作,并且花费时间来完成任务。当我检查时,可以理解,如果所有线程都忙,则其他任务将进入队列,一旦线程完成任务,它将从池中获取任务并完成任务。

因此,在这种情况下,将创建SampleRunnable 4到10的对象,该对象将在池中。

问题:由于我需要加载数百万个任务,因此无法加载队列中的所有记录,这可能导致内存问题。所以我的问题是,不是让所有任务都在队列中,而是有可能使主线程等待,直到任何一个执行者工作线程可用。

以下是我尝试的方法,而不是将很多任务排队:

方法1:执行者使用了数组阻塞队列,大小为5(例如)因此,在这种情况下,当第9个任务到来时,它将抛出RejectedExecutionException,并在catch子句中,使睡眠1分钟,然后递归尝试该睡眠。当线程可用时,将在任何重试中进行选择。] >

方法2:使用过的关机并等待终止。即,如果任务计数为5,我将关闭并等待终止。在等待终止“ if”块(executor.awaitTermination(60000,TimeUnit.SECONDS))中,我再次实例化线程池。


public class SampleMain {

public static void main(String[] args) {

ExecutorService executor = Executors.newFixedThreadPool(3);

for (int i=0;i<10;i++){ 
   executorService.execute(new SampleRunnable(i));
}

executor.shutdown();
}

我的场景是将数百万个数据插入后端,目前正在使用执行程序框架来加载此数据。我将用更简单的方式解释我的问题。在以下情况下,我是...

java multithreading executorservice
1个回答
0
投票

听起来像是问题,您想限制主线程,以使其不会领先于工作人员。如果是这种情况,请考虑显式构造一个ThreadPoolExecutor实例,而不是调用Executors.newFixedThreadPool()

© www.soinside.com 2019 - 2024. All rights reserved.