gpt4 book ai didi

java - 如果 ExecutorService 的队列已满会发生什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:47:08 24 4
gpt4 key购买 nike

我有一个高达 TB 的大文件,我的任务是逐行处理。每行需要 5 秒才能完成。为了提高性能,我将进程分派(dispatch)到这样的固定线程池

ExecutorService executor = Executors.newFixedThreadPool(5);     

while ((line = br.readLine()) != null) {
Runnable worker = new WorkerThread(line);
executor.execute(worker);
}

我的问题是,如果我放置如此多的任务使执行程序的队列不堪重负,会发生什么情况。它会抛出 StackOverflow 吗?

最佳答案

这可能有点偏离主题,但解决此问题的一个选项是使用固定长度的阻塞队列并使用 ThreadPoolExecutor.CallerRunPolicy()。这样,如果消费者不够快(因此队列被填满),那么调用者线程(生产者)将被用来运行任务本身。我们可以像下面这样初始化一个执行器:

executorService = new ThreadPoolExecutor(DEFAULT_THREAD_COUNT,
DEFAULT_THREAD_COUNT, 2, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(DEFAULT_QUEUE_LENGTH),
new ThreadPoolExecutor.CallerRunsPolicy());

From the API:“拒绝任务的处理程序直接在执行方法的调用线程中运行被拒绝的任务,除非执行程序已关闭,在这种情况下任务将被丢弃。”

关于java - 如果 ExecutorService 的队列已满会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20509947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com