题目
给定一个数组 int array[],如何用N个线程进行求和。
Java实现
- 用 ExecutorService executorService = Executors.newFixedThreadPool(k) 创建k个线程,
- 然后,将数组分成k分给每个线程执行;
-
使用ExecutorService 的 shutdown() 方法,关闭线程池,不再接受新的任务,但是已经提交的任务会继续执行,直到完成。一旦调用了 shutdown() 方法,如果之后尝试提交新任务给 ExecutorService,则会抛出 RejectedExecutionException 异常。
-
最后用 ExecutorService 判定是否执行完 isTerminated()
public static void main(String[] args) {
// 初始化数组
int array[] = new int[100];
for(int i=0; i< array.length; i++) {
array[i] = i;
}
// 多线程分段求和
int K = 4;
ExecutorService executorService = Executors.newFixedThreadPool(K);
AtomicInteger atomicInteger = new AtomicInteger(0);
int len = array.length / K;
for(int i=0; i< K; i++) {
int start = i * len;
int end = i == K - 1 ? array.length : start + len;
executorService.submit(() -> {
int sum = 0;
for(int j = start; j < end; j++) {
sum += j;
}
atomicInteger.addAndGet(sum);
});
}
// 关闭线程池,shutdown执行后,新任务不能加入,老线程任务继续执行完
executorService.shutdown();
while(!executorService.isTerminated()) {
// wait
}
// 输出结果
System.out.println(atomicInteger.get());
}