java - 不使用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);
}
如何在不使用连接的情况下实现这一点?任何帮助的家伙。
解决方案
这是使用线程池的代码版本,它在技术上满足了不使用的要求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);
这里有几件事不好:
- Using
join()
是必需的,因为否则程序执行中没有精确的点可以安全地检索计算的和并知道并行求和已完成。 synchronized
on run 方法不是必需的,因为可以并行汇总各个数组块,并且您已经在使用AtomicInteger
同步。
推荐阅读
- python - Python Flask:单击通过单击另一个按钮呈现的按钮
- javascript - 单击按钮时触发键盘事件
- hibernate - 使用 Hibernate 创建表
- python-3.x - 在networkx中按顺序获取源的祖先
- java - 如何获取在使用 Selenium 路由到另一个 url 之前临时出现的重定向 url?
- angular - 如何从angular4中的表单中删除formGroup?
- asp.net - 如何在 asp.net 中将 Fileupload 绑定到 Image 控件
- android - 如何从本地sqlite糖数据库android中检索数据
- html - 如何以红色和绿色显示 Unicode 字符“记录的黑色圆圈”
- r - blogdown 部署策略