1、创建自定义线程池
//自定义线程池
ThreadPoolExecutor ThreadPool = new ThreadPoolExecutor(
10,//核心线程数
200,//最大线程数
2,//超时时间
TimeUnit.SECONDS,//超时时间单位
new ArrayBlockingQueue<>(500),//阻塞队列,长度为3
Executors.defaultThreadFactory(),//默认线程工厂
new ThreadPoolExecutor.AbortPolicy()//拒绝策略:丢弃
);
2、创建异步任务
1、异步任务分类:
CompletableFuture.runAsync() 异步执行,无返回结果(一个参数调用默认线程池)
CompletableFuture.runAsync() 异步执行,无返回结果(两个参数调用自定义线程池【常用】)
CompletableFuture.supplyAsync() 异步执行,有返回结果(一个参数调用默认线程池)
CompletableFuture.supplyAsync() 异步执行,有返回结果(两个参数调用自定义线程池【常用】)
2、示例:
1、CompletableFuture.runAsync() 异步执行,无返回结果(两个参数调用自定义线程池【常用】)
//1、使用自定义线程池ThreadPool启动一个没有返回值的异步任务
CompletableFuture.runAsync(() -> {
System.out.println("异步任务开始");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("异步任务执行完成");
}, ThreadPool);
执行结果:
2、CompletableFuture.supplyAsync() 异步执行,有返回结果(两个参数调用自定义线程池【常用】)
//2、使用自定义线程池ThreadPool启动一个有返回值的异步任务
CompletableFuture<Integer> supplyAsync = CompletableFuture.supplyAsync(() -> {
System.out.println("异步任务开始");
int i = 10/2;
System.out.println("异步任务执行完成");
return i;
}, ThreadPool);
Integer integer = supplyAsync.get();
System.out.println("main结束" +integer);
执行结果:
3、计算完成时回调方法,感知结果-> CompletableFuture.supplyAsync() 链式调用whenComplete
4、计算完成时回调方法,处理结果-> CompletableFuture.supplyAsync() 链式调用handle
5、线程串行化
6、多任务完成处理,组合任务(都要完成)
任务1任务2都完成,开始任务3,
1、不感知结果,没有返回结果
2、感知结果,没有返回结果
3、感知结果,有返回值
7、多任务完成处理,组合任务(一个完成就执行)
1、不感知任务结果,不返回
2、感知任务结果,不返回
3、感知任务结果,并返回结果
8、多任务组合
等待所有任务完成,使用allof,最后调用get方法,阻塞等待所有任务执行完成
只要有一个任务完成,就get