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

在Java 1.6中使用多线程For循环,java,multithreading,Java,Multithreading,我尝试在Java1.6中使用多线程的For循环。我尝试使用streams,但显然它是在Java1.8中添加的,所以我尝试使用ExecutorService和Future,但我无法让它工作 我想要的是使这段代码具有固定线程数的多线程 for (ExampleType ex : exampleData) { exampleFunction(ex.getSomeData()); } 我试过但没用的东西,是在谷歌的某个地方找到的 final ExecutorService testExecut

我尝试在Java1.6中使用多线程的For循环。我尝试使用streams,但显然它是在Java1.8中添加的,所以我尝试使用ExecutorService和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
}
final executor服务testExecutor=Executors.newFixedThreadPool(10);//只有10根线
最终列表executeData=testExecutor.submit(()->{
exampleFunction(例如getSomeData());
});
添加(executeData);
}
for(未来已执行数据:已执行数据){
executeData.done();//我需要在这里写东西吗?我没有done()函数
}

它可能会工作,但说钻石运算符在源代码1.6中不受支持。是的,我不知道从这里该怎么处理,被卡住了。感谢任何帮助

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

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();
}
final executor服务testExecutor=Executors.newFixedThreadPool(10);
最终名单>();
例如(ExampleType示例:exampleData){
Future executeData=testExecutor.submit(new Runnable()){
@凌驾
公开募捐{
exampleFunction(例如getSomeData());
}
});
添加(executeData);
}
for(未来已执行数据:已执行数据){
//调用get in循环以有效地等待所有未来完成
executeData.get();
}
进行了三项修改:


  • ArrayList
    替换为
    ArrayList由于lambda,该代码在Java 6中无法工作。您需要将其编写为一个匿名类。
    executeData.get()
    按您提交结果的顺序等待结果。如果您希望它们按完成顺序排列,请使用
    CompletionService
    。为什么还要使用Java1.6?它已经有10多年的历史了。