并发框架执行多任务的小实践

编程入门 行业动态 更新时间:2024-10-08 13:39:06

并发<a href=https://www.elefans.com/category/jswz/34/1770644.html style=框架执行多任务的小实践"/>

并发框架执行多任务的小实践

并发框架定义

public class FutureTaskWorker {# 查看处理器数private static final int processors = Runtime.getRuntime().availableProcessors();# 定义线程池private static final ExecutorService executor = Executors.newFixedThreadPool(processors + 1);static {# 查看一下机器处理器数System.out.println(processors + " processors");}# 实现方式1----------------------------------------------------------------------------public static <T, R> List<R> handle(List<T> tasks, Function<T, R> function) {List<CompletableFuture<R>> featureRes = new ArrayList<>();for (T task : tasks) {# 任务添加到线程池CompletableFuture<R> feature = CompletableFuture.supplyAsync(() -> function.apply(task), executor);featureRes.add(feature);}List<R> res = new ArrayList<>();try {# 等所有任务执行完成CompletableFuture.allOf(featureRes.toArray(new CompletableFuture[0])).get();# 收集执行结果for (CompletableFuture<R> feature : featureRes) {res.add(feature.get());}return res;} catch (InterruptedException | ExecutionException e) {throw new RuntimeException(e);}}# 实现方式2----------------------------------------------------------------------------public static <T, R> List<R> handle1(List<T> tasks, Function<T, R> function) {# 任务添加到线程池List<CompletableFuture<R>> futureList = tasks.stream().map(task -> CompletableFuture.supplyAsync(() -> function.apply(task), executor)).collect(Collectors.toList());# 等所有任务执行完成CompletableFuture<Void> allCompletableFuture = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));# 收集执行结果return allCompletableFuture.thenApply(e -> futureList.stream().map(CompletableFuture::join).collect(Collectors.toList())).join();}public static void shunDown() {executor.shutdownNow();}
}

并发框架使用

public static void main(String[] args) {List<String> names = new ArrayList<>();names.add("小明1");names.add("小明2");names.add("小明3");names.add("小明4");names.add("小明5");names.add("小明6");names.add("小明7");names.add("小明8");names.add("小明9");try {# 使用并发框架来执行多任务List<String> res = handle1(names, name -> businessMethod(name));res.forEach(System.out::println);} finally {# 关闭线程池shunDown();}
}# 这里模拟业务方法
public static String businessMethod(String str) {System.out.println(Thread.currentThread().getName() + "线程:" + new Date());return str + "  " + new Date();
}# 执行结果
16 processors
pool-1-thread-1线程:Fri Nov 03 15:18:10 CST 2023
pool-1-thread-9线程:Fri Nov 03 15:18:10 CST 2023
pool-1-thread-6线程:Fri Nov 03 15:18:10 CST 2023
pool-1-thread-5线程:Fri Nov 03 15:18:10 CST 2023
pool-1-thread-3线程:Fri Nov 03 15:18:10 CST 2023
pool-1-thread-2线程:Fri Nov 03 15:18:10 CST 2023
pool-1-thread-7线程:Fri Nov 03 15:18:10 CST 2023
pool-1-thread-8线程:Fri Nov 03 15:18:10 CST 2023
pool-1-thread-4线程:Fri Nov 03 15:18:10 CST 2023
小明1  Fri Nov 03 15:18:10 CST 2023
小明2  Fri Nov 03 15:18:10 CST 2023
小明3  Fri Nov 03 15:18:10 CST 2023
小明4  Fri Nov 03 15:18:10 CST 2023
小明5  Fri Nov 03 15:18:10 CST 2023
小明6  Fri Nov 03 15:18:10 CST 2023
小明7  Fri Nov 03 15:18:10 CST 2023
小明8  Fri Nov 03 15:18:10 CST 2023
小明9  Fri Nov 03 15:18:10 CST 2023

参考:

使用CompletableFuture.allOf实现异步执行同步搜集结果
CompletableFuture用法详解

更多推荐

并发框架执行多任务的小实践

本文发布于:2023-11-17 11:59:10,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1644046.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:框架

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!