我有一个从循环中调用的任务。该任务适用于一次性数据库命中。我希望加快执行速度,所以我创建了一个runnable并将其传递给Executor。
public void run () {
for (int i=0,size=5; i<5 ; i++) {
doWork();
}
}
// above is a part of Runnable implementation
ExecutorService service = Executors.newFixedThreadExecutor(5);
service.execute(runnable);
service.shutdown();
// new code follows
for(Map.Entry entry : map.entrySet) {
service.execute( new Runnable() {
public void run() {
doWork(entry); // error : can't have a non-final variable in an inner class
}
});
}
service.shutdown();
我实现了分解工作的目标,但内部阶级没有采用非最终变量。我如何划分工作并传入执行人? 感谢
答案 0 :(得分:3)
你似乎误解了实际发生的事情。使用5
参数创建执行程序服务不会使其执行您提交的Runnable
5次;它只创建了五个可用的线程,但是你只提交了一个工作,它本身就是你的循环。唯一的结果是您在不同的线程中执行工作,而不是并行执行。你的四个线程将闲置,而第五个线程运行你提交的单个Runnable
。
您要做的是从runnable中删除循环,然后提交工作五次。例如,像这样:
ExecutorService service = Executors.newFixedThreadPool(5);
for(int i = 0; i < 5; i++) {
service.execute(new Runnable() {
public void run() {
doWork();
}
});
}
service.shutdown();