在开发中有时经常用到异步多线程技术来快速高效完成某些任务,那常用的异步多线程技术参考如下:
1,建立一个用户自定义线程池
/**
* 自定义用户线程池,
* 注意:避免系统默认的线程池出现的性能问题
*/
@Bean("myExecutor")
public Executor myExecutor() {
ThreadPoolTaskExector executor = new ThreadPoolTaskExector();
//核心线程数
executor.setCorePoolSize(10);
//最大线程数
executor.setMaxPoolSize(20);
//队列中等待处理的最大的数目
executor.setQueueCapacity(200);
//线程空闲后的最大存活时间单位秒
executor.setKeepAliveSeconds(120);
//对拒绝task的处理策略
//rejection-policy:当pool已经达到max size的时候,如何处理新任务
//CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExector.CallerRunsPolicy());
//线程名称前缀
executor.setThreadNamePrefix("myExecutor-thread-pool-");
return executor;
}
2,各种场景的异步多线程参考如下注释和代码片段
/**
Java技术
1,异步多线程并行执行
注意:
myExecutor 为自定义的线程池;
runAsync 方法不支持返回值
supplyAsync 可以支持返回值
**/
String param01 = "...";
int param02 = "...";
CompletableFuture.supplyAsync((param01, param02) -> {
try {
String msg = xxService.fun01(param01, param02);
return msg;
} catch(Exception e){
throw e;
} finally{
// 最后执行
// todo...
}
},myExecutor);
/**
2,异步多线程并行执行,某线程执行完,然后再执行后续如回调操作,
注意:
myExecutor 为自定义的线程池;
whenComplete 和 whenCompleteAsync 的区别:
whenComplete:是执行当前任务的线程执行继续执行 whenComplete 的任务。
whenCompleteAsync:是执行把 whenCompleteAsync 这个任务继续提交给线程池来进行执行。
exceptionally:异常处理方法
*/
String param01 = "...";
int param02 = "...";
CompletableFuture.supplyAsync((param01, param02) -> {
try {
String msg = xxService.fun01(param01, param02);
return msg;
} catch(Exception e){
throw e;
} finally{
// todo...
}
},myExecutor).whenComplete((result, error) -> {
// 单线程内执行完,然后再执行后续回调等操作
// 此处参数 result 其实就是上面返回的msg对象
String msg2 = xxService.fun02(result);
return msg2;
// todo...
}).exceptionally((throwable) -> {
// 异常时执行
// todo...
result "发生异常";
});
/**
3,异步多线程并行执行,某单个线程内又有串行执行,单线程内执行完,然后再执行后续如回调操作,
注意:
myExecutor 为自定义的线程池;
handle 方法和 thenApply 方法处理方式基本一样;不同的是:
handle 是在任务完成后再执行,还可以处理异常的任务。
thenApply 只可以执行正常的任务,任务出现异常则不执行 thenApply 方法
*/
String param01 = "...";
int param02 = "...";
CompletableFuture.supplyAsync((param01, param02) -> {
/