异步
初始化线程的4种方式
-
继承thread
-
实现Runnable接口
-
实现Callable接口+FutureTask(可以拿到返回结果,可以处理异常)jdk1.5后添加的 可以将Callable转化为Future Future内部继承Runable接口
-
线程池
-
定义一个配置类,改配置类向容器中注入一个threadPoolExecutor
-
`@Configuration
public class MyThreadConfig {@Bean
public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties threadPoolConfigProperties){return new ThreadPoolExecutor(threadPoolConfigProperties.getCoreSize(), threadPoolConfigProperties.getMaxSize(), threadPoolConfigProperties.getKeepAliveTime() ,TimeUnit.SECONDS, new LinkedBlockingDeque<>(10000), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
}
}`
线程池的属性配置可以写进属性文件中
之后就可以在组件中使用了
@Autowired
private ThreadPoolExecutor executor; -
线程池的执行流程 一个线程池core7, max 20, queue 50, 100并发进来是怎么分配的
首先100并发里有7个线程通过core线程执行,再讲50个线程放入队列中,当阻塞队列满了还有线程,就开max线程,这是最大为20,所以还会有13个线程会执行,如果还有线程就会执行指定的拒绝策略。
当异步任务有一个执行顺序时,需要进行异步编排
6. CompletableFuture 异步编排 是future接口的实现类,future有一个get方法,可以获取线程执行的结果 使用函数式接口
两个方法
- supplyAsync(Supplier supplier, Executor executor)
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
由于Supplier接口定义了一个get方法所以可以返回执行结果
3. runAsync(Runnable runnable, Executor executor)
不返回执行结果
4. whenComplete(BiConsumer<? super T, ? super Throwable> action)
感知异常 给出默认结果
这里能获取异常信息 但是没法修改数据