一. 使用java.util.concurent包下面的CompletableFuture
CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
System.out.println("异步线程:" + Thread.currentThread().getName());
System.out.println("异步线程起跑");
} catch (InterruptedException e) {
e.printStackTrace();
}
return "ss";
}).whenComplete(new BiConsumer<String, Throwable>() {
@Override
public void accept(String s, Throwable throwable) {
System.out.println("完成后使用的线程:" + Thread.currentThread().getName());
}
});
1)supplyAsync, 使用子线程异步执行业务,并且会生成一个返回值
2)whenComplete,当supplyAsync中的逻辑完成,会使用同一个子线程完成下面的业务
3)上面的方式默认使用的ForkJoin的默认线程池,可以用自己定义的线程池来替换
例如:使用Java的ThreadPoolExecutor来替换
ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 200, 30,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(10000), new ThreadPoolExecutor.CallerRunsPolicy());
CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
System.out.println("异步线程:" + Thread.currentThread().getName());
System.out.println("异步线程起跑");
} catch (InterruptedException e) {
e.printStackTrace();
}
return "ss";
},executor).whenComplete(new BiConsumer<String, Throwable>() {
@Override
public void accept(String s, Throwable throwable) {
System.out.println("完成后使用的线程:" + Thread.currentThread().getName());
}
});
更多具体内容参考:
https://www.jianshu.com/p/6bac52527ca4
二. springframe框架中@Async注解的使用
1090

被折叠的 条评论
为什么被折叠?



