繁体   English   中英

将计算除以多个线程

[英]Divide calculations among multiple threads

我刚刚开始使用Java中的线程。 我有一个简单的算法,可以进行很多计算。 我需要做的是将这些计算分配到不同的线程中。 看起来像这样:

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

我想做的是这样的:

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

     // Wait for them to finish calculating

     // Check results

     ... Repeat

}

计算线程不必具有关键部分,也不必彼此同步,因为它们无需更改任何共享变量。

我不知道的是如何命令线程启动并等待它们完成。

线程[n] .start()和线程[n] .join()引发异常。

谢谢!

我使用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.
}

使用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

学习MapReduceHadoop 我认为这可能比滚动自己的方法更好,但要付出更多的依赖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM