执行大量任务的最佳实践

时间:2017-07-05 11:01:22

标签: java concurrency java.util.concurrent

下面的代码在循环中创建了大量的可运行对象,甚至只有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);
}

1 个答案:

答案 0 :(得分:2)

要求在任何时刻内存中只有5个可运行对象存在限制性太强。当任务完成时,将不会运行下一个任务,并且花费一些时间来创建另一个任务。最好有5个runnung任务和5个排队等候。为了限制队列中任务的数量,对可运行的程序使用固定大小的BlockingQueue,例如

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

UPDT要避免RejectedExecutionException,请按https://stackoverflow.com/a/3518588/1206301中的建议添加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);