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