加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:26:26 所属栏目:Java 来源:网络整理
导读:我有一个高达TB的大文件,我的任务是逐行处理.每一行应该花费5秒才能完成.为了提高性能,我将进程分配给这样的固定线程池 ExecutorService executor = Executors.newFixedThreadPool(5); while ((line = br.readLine()) != null) { Runnable worker = new Work
我有一个高达TB的大文件,我的任务是逐行处理.每一行应该花费5秒才能完成.为了提高性能,我将进程分配给这样的固定线程池
ExecutorService executor = Executors.newFixedThreadPool(5);     

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

我的问题是如果我通过执行如此多的任务来压倒执行程序的队列会发生什么.它会抛弃StackOverflow吗?

解决方法

这可能是一个主题,但是这个问题的一个选项是使用固定长度的阻塞队列并使用ThreadPoolExecutor.CallerRunPolicy().这样,如果消费者不够快(因此队列正在填满),那么将使用调用者线程(生产者)来运行任务本身.我们可以像下面这样初始化一个Executor:
executorService = new ThreadPoolExecutor(DEFAULT_THREAD_COUNT,DEFAULT_THREAD_COUNT,2,TimeUnit.MINUTES,new ArrayBlockingQueue<Runnable>(DEFAULT_QUEUE_LENGTH),new ThreadPoolExecutor.CallerRunsPolicy());

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读