最近参加了一个学校的程序设计比赛,为了解决运算速度使用了多线程,但是一个问题难倒我了,那就是怎么获取多线程的运算结果并作处理呢?查看的很多博客也没有得到满意的答案。
目的:将多线程的运算结果存入线程安全的集合中
一下几种方案我都没有成功,可能是我的使用有问题,如果有人看到感谢你们指出
1.使用带有返回值的Callable和接收返回值的Future
但是使用多个线程同时持有一个FutureTask进行运算
Callable<Map<Integer, String>> task = new Task(resultMap2);
FutureTask<Map<Integer, String>> future = new FutureTask<Map<Integer, String>>(
task);
int n = 10;
Thread[] threads = new Thread[n];
for (int i = 0; i < n; i++) {
threads[i] = new Thread(future);
// service.execute(threads[i]);
threads[i].start();
}
失败2.使用join()方法,但是这样子线程并入主线程和单线程有什么区别
失败
3.使用CyclicBarrier
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(10, new Runnable() {
@Override
public void run() {
Set<Map.Entry<Integer, String>> entry = resultMap2.entrySet();
Iterator<Map.Entry<Integer, String>> iterator = entry
.iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, String> en = iterator.next();
System.out.println(en.getKey());
System.out.println(en.getValue());
}
}
});
设置每10个线程处理一次结果,但是这样的话储存运算结果的集合就会以直被处理结果的Runnable占用
失败
4.某日突然灵光一闪
使用while(flag)一直使主线程不结束
while (flag) {
while (lists.size() == read.filePathsList.size()) {
//排序
Collections.sort(lists, new ListListSortComparator(0, "asc"){});
CreatExcel.creatExcel(lists, titles, "xlsx", "企业信息表").write(os);
os.close();
long millis2 = System.currentTimeMillis();
System.out.println("(millis2 - millis1)---结束-------->"
+ (millis2 - millis1));
flag = false;
break;
}
}
在所有的结果运算结束后flag=flase
成功