java线程异步执行

106 阅读1分钟
Runnable
Thread thread = new Thread(()->{});
thread.start();
CompletableFuture
  • runAsync:没有返回值
  • supplyAsync:有返回值,通过get()方法获取返回值(会阻塞)
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    System.out.println("无返回值...");
});

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    System.out.println("有返回值...");
    return "Hello World";
});
String result = future.get();
System.out.println(result);
ThreadPoolExecutor
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
    Runtime.getRuntime().availableProcessors() * 2, 16,
    5L, TimeUnit.MINUTES,
    new LinkedBlockingQueue<>(30),
    new ThreadPoolExecutor.CallerRunsPolicy()
);
threadPool.submit(() -> {

});
Async注解
  • @Async注解标注的方法会被aop拦截,环绕通知中会开启另一个线程处理
  • @Async 注解修饰的方法,返回值只能是 void 或者 Future(可以看源码),相关文章:juejin.cn/post/700467…
@Service
public class ThreadService {
    @Async("taskExecutor")
    public void run() {
    }
}

@Configuration
@EnableAsync
public class ThreadPoolConfig {
    @Bean("taskExecutor")
    public Executor pool() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 设置核心线程数
        executor.setMaxPoolSize(20); // 设置最大线程数
        executor.setQueueCapacity(100); //配置队列大小
        executor.setKeepAliveSeconds(60); // 设置线程活跃时间(秒)
        executor.setThreadNamePrefix("asyncServiceExecutor :"); // 线程名字前缀
        executor.setWaitForTasksToCompleteOnShutdown(true); // 等所有任务执行完再关闭线程池
        return executor;
    }
}