1.使用场景
你想拿到异步处理的结果,但是你又不想主线程一直堵塞在那边 等异步结果的返回。
2.代码
package com.example.test.thread.future;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.util.concurrent.ListenableFutureCallback;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
/***
* 基于spring
*/
@Slf4j
public class ThreadPoolTaskExecutorTest {
public static void main(String[] args) {
//实际业务中建议-自己定义核心线程数,最大线程数,阻塞队列啥的
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.initialize();
log.info("ThreadPoolTaskExecutor 任务开始--- {}",LocalTime.now());
ListenableFuture<List<String>> future = executor.submitListenable(() -> {
TimeUnit.SECONDS.sleep(4);
return Arrays.asList("A1", "B2", "C3");
});
future.addCallback(new ListenableFutureCallback<List<String>>(){
@Override
public void onSuccess(List<String> result) {
log.info(Thread.currentThread().getName() + ":异步任务执行成功,结果是:" + result + ",时间:" + LocalTime.now());
// 关闭线程池,实际业务上看自己的需求
executor.shutdown();
}
@Override
public void onFailure(Throwable throwable) {
log.info("异步任务执行失败---{}", throwable);
}
});
log.info("{}:主线程继续执行其他任务... {}", Thread.currentThread().getName(), LocalTime.now());
}
}
3.执行结果