首页 > 解决方案 > 不使用join()的数组的多线程求和

问题描述

我将数组分开并分别对其各部分求和,最后,使用连接将所有内容添加到单个变量中。

类代码主要

int partArray = array.length / THREAD;
int first = 0;
AtomicInteger result = new AtomicInteger(0);
Thread[] thr = new Thread[THREAD];

for(i = 0; i < THREAD; ++i) {
    thr[i] = new Thread(new ThreadSum(first, first + partArray, array, result));
    thr[i].start();
    first += partArray;
}

for(i = 0; i < THREAD; ++i) {
    thr[i].join();
}

类代码线程

int first;
int end;
private int[] array;
private AtomicInteger result;

public ThreadSum(int first, int end, int[] array, AtomicInteger result) {
    this.first = first;
    this.end = end;
    this.array = array;
    this.result = result;
}

public synchronized void run() {
    int sum = 0;

    for(int i = first; i < end; ++i) {
        sum += array[i];
    }
    result.getAndAdd(sum);
}

如何在不使用连接的情况下实现这一点?任何帮助的家伙。

标签: javamultithreading

解决方案


这是使用线程池的代码版本,它在技术上满足了不使用的要求join()

int partArray = array.length / THREAD;
int first = 0;
AtomicInteger result = new AtomicInteger(0);
ExecutorService threadPool = Executors.newCachedThreadPool();

for(i = 0; i < THREAD; ++i) {
    threadPool.execute(new ThreadSum(first, first + partArray, array, result));
    first += partArray; 
}

threadPool.shutdown();
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

这里有几件事不好:

  1. Usingjoin()是必需的,因为否则程序执行中没有精确的点可以安全地检索计算的和并知道并行求和已完成。
  2. synchronizedon run 方法不是必需的,因为可以并行汇总各个数组块,并且您已经在使用AtomicInteger同步。

推荐阅读