执行大量任务的最佳实践

Best practice for executing large number of tasks

下面的代码在循环中创建了大量的可运行对象,甚至只有 5 个线程来处理任务。有什么办法可以在任何时候内存中只存在 5 个可运行对象,而不是任务总数(100000)。

ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10000; i++) {
    Runnable worker = new WorkerThread("" + i);
    System.out.println("ExecutorExample.main()");
    executor.execute(worker);
}

任何时候内存中只存在 5 个 运行nable 对象的要求过于严格。当一个任务完成时,运行 将没有下一个任务,并且会花费一些时间来创建另一个任务。最好有 5 个 运行nung 任务和 5 个排队等候。为了限制队列中任务的数量,为 运行nables 使用固定大小的 BlockingQueue,例如

ThreadPoolExecutor executor = new ThreadPoolExecutor(
     5, 5,
     10L, TimeUnit.MILLISECONDS,
     new LinkedBlockingQueue<Runnable>(5)
)

UPDT 为避免 RejectedExecutionException,添加 RejectedExecutionHandler,如 :

中所建议
RejectedExecutionHandler block = new RejectedExecutionHandler() {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            try {
                executor.getQueue().put(r);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    executor.setRejectedExecutionHandler(block);