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