编程的魅力
首页
分类
标签
归档
动态
关于我
hyuga
2020-05-27
85
2020-07-17 20:19:08
原创
批量获取多条线程的执行结果
## 场景 一个list,拆分成5份,每份数据放入线程池,返回future。 5个future任务,5个get方法。代码实在不雅观。 如下: ``` List
list = ListUtil.NEW(1, 2, 3, 4, 5, 6); List
> lists = ListUtil.splitList(list, 3); Future> future1 = ThreadPool.submit(() -> { List
integers = lists.get(0); integers.forEach(System.out::println); }); Future> future2 = ThreadPool.submit(() -> { List
integers = lists.get(1); integers.forEach(System.out::println); }); Future> future3 = ThreadPool.submit(() -> { List
integers = lists.get(2); integers.forEach(System.out::println); }); try { future1.get(); future2.get(); future3.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } ``` ## 改造 ``` List
sourceList = ListUtil.NEW(1, 2, 3, 4, 5, 6); List
> lists = ListUtil.splitList(sourceList, 3); List
>> tasks = ListUtil.NEW(); lists.forEach(listTemp -> { Callable
> task = () -> { List
result = ListUtil.NEW(); ListUtil.optimize(listTemp).forEach(x -> result.add(x + 1)); return result; }; ThreadPool.submit(task); tasks.add(task); }); List
> result = ThreadPool.invokeAllTask(tasks); System.out.println(result); ``` 相关代码: ``` public static
Future
submit(Callable
task) { return getPool().submit(task); } public static
List
invokeAllTask(List
> tasks) { List
> futureList; List
results = new ArrayList<>(tasks.size()); try { futureList = executorService.invokeAll(tasks); for (Future
future : futureList) { results.add(future.get()); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } return results; } ``` ## 参考 - [Java并发编程的艺术(九)——批量获取多条线程的执行结果](https://blog.csdn.net/u010425776/article/details/54580710) - 作者:凌澜星空 - 来源:CSDN
JAVA
评论
发布
留言
评论