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

如果您需要多次这样做,那么 aCyclicBarrier可能是您应该使用的。

于 2012-12-15T15:20:58.273 回答
0

学习MapReduceHadoop。我认为这可能是比自己滚动更好的方法,但代价是更大的依赖关系。

于 2012-12-15T15:33:20.573 回答