如何使用Runnable的内部类实现与java中的Executor一起工作?

时间:2014-02-02 21:02:33

标签: java multithreading

我有一个从循环中调用的任务。该任务适用于一次性数据库命中。我希望加快执行速度,所以我创建了一个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();

我实现了分解工作的目标,但内部阶级没有采用非最终变量。我如何划分工作并传入执行人? 感谢

1 个答案:

答案 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();