【问题标题】:Java fork join issueJava fork 加入问题
【发布时间】:2013-05-28 16:46:39
【问题描述】:

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

目前我的向量中只有 1 个数字。

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();
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    您正在每个线程中创建一个新向量,与共享内存没有任何联系。您可以只将要写入的索引传递给每个线程,也可以将向量更改为数组或预先分配的东西。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2010-12-12
      相关资源
      最近更新 更多