java - 在多个线程之间划分计算

标签 java multithreading concurrency

我刚刚开始使用 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() 抛出异常。

谢谢!

最佳答案

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

关于java - 在多个线程之间划分计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13893379/

相关文章:

c++ - 在处理程序中排队请求时,从多个线程或一个线程调用boost asio io_service.run

multithreading - 我不懂多线程编程

java - Drools 运行时错误

java - DBUnit自动数据集生成

java - 可以在 Java 中更改内部类的外部类实例吗?

java - 为什么我的线程使我的 JavaFX 应用程序滞后?

go - 是否可以在不触发竞争条件的情况下检查是否已设置字段?

go - 从 goroutine 中捕获返回值

java - Java中并发Cache的修改

java - 如何使用 hibernate 删除/编辑 JTable 和 MySQL 中的行?