Java fork join问题

时间:2013-06-02 09:20:44

标签: concurrency executorservice java.util.concurrent callable fork-join

我正在学习java中的fork-join技术并编写了以下程序。我正在运行for循环(5次),我想在不同的线程中运行for循环的内容。这是正确发生的。问题是当所有线程都完成后,我想要一个大小为5的向量,它必须包含在索引0处执行线程1的结果,在索引1处执行线程2的结果........ ....在索引4处执行线程5的结果。我干净地可视化我想要实现的内容,但不知道它的语法。

目前我的矢量中只有一个数字。

import java.util.Random;
import java.util.Vector;
import java.util.concurrent.*;


public class App {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ExecutorService executor = Executors.newCachedThreadPool();
        Future<Vector<Integer> > futureResult = null;
        for(int i = 0; i < 5; i++){
            futureResult = executor.submit(new Callable<Vector<Integer> >(){
                @Override
                public Vector<Integer>  call() throws Exception {
                    Random random = new Random();
                    int duration = random.nextInt(4000);                    
                    Vector<Integer> v = new Vector<Integer>();
                    v.add(duration);
                    return v;
                }
            }); 
        }

        executor.shutdown();

        try {
            System.out.println(futureResult.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您正在每个线程中创建一个新向量,而不与共享内存建立任何连接。您可以只传递索引以写入每个线程,并将向量更改为数组或预先分配的内容。

另一种选择是分配5个向量位置并将每个Integer对象发送到它的线程。