【发布时间】:2020-02-15 14:44:30
【问题描述】:
我有一个将数百万数据插入后端的场景,目前正在使用执行器框架来加载它。我将用更简单的术语解释我的问题。
在以下情况下,我有 10 个可运行的线程和三个线程来执行相同的操作。考虑我的可运行对象正在执行插入操作,完成任务需要时间。当我检查时,了解到,如果所有线程都忙,其他任务将进入队列,一旦线程完成任务,它将从池中获取任务并完成它。
所以在这种情况下,SampleRunnable 4 到 10 的对象将被创建,这将在池中。
问题:由于我需要加载数百万个任务,我无法加载队列中的所有记录,这会导致内存问题。所以我的问题是,不是将所有任务都放在队列中,是否可以让主线程等待,直到任何一个执行器工作线程可用。
按照我尝试的解决方法而不是排队这么多任务:
方法 1:使用 Array Blocking Queue 作为 executor,大小为 5(例如) 所以在这种情况下,当第 9 个任务到来时,这将抛出 RejectedExecutionException 并在 catch 子句中,休眠 1 分钟并递归地尝试相同。当线程可用时,这将在任何重试时被拾取。
方法 2:使用关闭并等待终止。即如果任务计数为 5,我将关闭并等待终止。在 await Termination '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