在Java 1.6中使用具有多线程的For循环

时间:2018-04-26 18:32:17

标签: java multithreading

我试图在Java 1.6中使用具有多线程的For循环。我试图使用流,但显然它是在Java 1.8中添加的,所以我尝试使用ExcutorService和Future但我无法使其工作。

我想要的只是使用固定数量的线程使这个代码成为多线程。

for (ExampleType ex : exampleData) {
    exampleFunction(ex.getSomeData());
}

我尝试过但没有工作,从谷歌的某个地方发现它

final ExecutorService testExecutor = Executors.newFixedThreadPool(10); // just 10 thread
final List<Future<?>> executeDatas = new ArrayList<List>();

for (ExampleType ex : exampleData) {
    Future<?> executeData = testExecutor.submit(() -> {
        exampleFunction(ex.getSomeData());
    });
    executeDatas.add(executeData);
}

for (Future<?> executeData : executeDatas) {
    executeData.done(); // do i need to write stuff here? i don't have done() function
}

它可能会起作用但是在1.6版本中不支持钻石操作员。是的,我不确定如何从这里处理并被困住。任何帮助表示赞赏

1 个答案:

答案 0 :(得分:2)

出于某种原因,没有人显示转换后的代码,所以我会这样做:

break

进行了三项更改:

  1. final ExecutorService testExecutor = Executors.newFixedThreadPool(10); final List<Future<?>> executeDatas = new ArrayList<Future<?>>(); for (ExampleType ex : exampleData) { Future<?> executeData = testExecutor.submit(new Runnable() { @Override public void run() { exampleFunction(ex.getSomeData()); } }); executeDatas.add(executeData); } for (Future<?> executeData : executeDatas) { // calling get in loop to effectively wait for all the futures to finish executeData.get(); } 已替换为ArrayList<List>
  2. Lambda替换为匿名类实例化
  3. ArrayList<Future<?>>更改为.done()以等待所有期货完成执行