我有一个高达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方法的调用线程中运行被拒绝的任务,除非执行程序已被关闭,在这种情况下任务被丢弃.”