有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否可以在executor服务的所有线程都在处理任务时等待主线程

我有一个将数百万数据插入后端的场景,目前使用executor框架来加载它。我将用更简单的术语解释我的问题

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

所以在本例中,将创建SampleRunnable 4到10的对象,该对象将位于池中

问题:由于我需要加载数百万个任务,我无法加载队列中的所有记录,这可能会导致内存问题。因此,我的问题是,与其接受队列中的所有任务,不如让主线程等待任何一个执行器工作线程可用

我尝试了以下方法作为变通方法,而不是将这么多任务排队:

方法1:对执行器使用数组阻塞队列,并将大小设置为5(例如) 因此,在本例中,当第9个任务到来时,将抛出RejectedExecutionException,并在catch子句中,放置一个睡眠1分钟,然后递归地尝试相同的操作。当线程可用时,这将在任何重试时被拾取

方法2:用于关闭并等待终止。i、 e.如果任务计数为5,我将关闭并等待终止。在等待终止'if'块(executor.waittermination(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();
}

共 (1) 个答案

  1. # 1 楼答案

    听起来问题是,您想限制主线程,这样它就不会超过工作人员。如果是这种情况,那么考虑显式构造^ {< CD1> }实例,而不是调用^ {CD2}}。

    该类有几个不同的构造函数,其中大多数都允许您提供自己的阻塞队列。如果您创建一个大小有限的ArrayBlockingQueue,那么每次队列满时,主线程都会自动被阻塞,直到工作线程通过执行另一个任务腾出空间

    final int work_queue_size = 30;
    BlockingQueue work_queue = new ArrayBlockingQueue(work_queue_size);
    ExecutorService executor = new ThreadPoolExecutor(..., work_queue);
    
    for (int i=0;i<10;i++){ 
        executorService.execute(new SampleRunnable(i));
    }
    ...