1

Javaでスレッドを使い始めたところです。私は多くの計算を行う単純なアルゴリズムを持っています。私がする必要があるのは、それらの計算を異なるスレッド間で分割することです。次のようになります。

while(...) {
      ....
      doCalculations(rangeStart, rangeEnd);
}

そして、私がやりたいのは次のようなものです。

while(...) {
     ...
     // Notify N threads to start calculations in specific range

     // Wait for them to finish calculating

     // Check results

     ... Repeat

}

計算スレッドは、共有変数を変更しないため、クリティカルセクションを持ったり、相互に同期したりする必要はありません。

私が理解できないのは、スレッドを開始して終了するのを待つ方法です。

thread [n] .start()およびthread [n] .join()は例外をスローします。

ありがとうございました!

4

3 に答える 3

5

ExecutorServiceを使用しています

private static final int procs = Runtime.getRuntime().availableProcessors();
private final ExecutorService es = new Executors.newFixedThreadPool(procs);

int tasks = ....
int blockSize = (tasks + procss -1) / procs;
List<Future<Results>> futures = new ArrayList<>();

for(int i = 0; i < procs; i++) {
    int start = i * blockSize;
    int end = Math.min(tasks, (i + 1) * blockSize);
    futures.add(es.submit(new Task(start, end));
}

for(Future<Result> future: futures) {
    Result result = future.get();
    // check/accumulate result.
}
于 2012-12-15T15:31:21.047 に答える
4

CountDownLatchを使用して開始し、別のCountDownLatchを使用して終了します。

CountDownLatch start = new CountDownLatch(1);
CountDownLatch finish = new CountDownLatch(NUMBER_OF_THREADS);
start.countDown();
finish.await();

そして、各ワーカースレッドで:

start.await();
// do the computation
finish.countDown();

そして、それを数回行う必要がある場合CyclicBarrierは、おそらくaを使用する必要があります。

于 2012-12-15T15:20:58.273 に答える
0

MapReduceHadoopを学びましょう。依存関係が大きくなるという犠牲を払って、自分でロールするよりも優れたアプローチになると思います。

于 2012-12-15T15:33:20.573 に答える