ThreadPoolExecutor
,但實際上Spring它也對該線程池作了一層封裝,他就是ThreadPoolTaskExecutor
initialize()
方法初始化,實際去作的就是初始化ThreadPoolExecutor
ListenableFutureCallback
,能夠用做異步回調處理/** * @author laoliangliang * @date 2019/10/10 10:10 */ public class ExecutorDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(1); executor.setMaxPoolSize(5); executor.setQueueCapacity(1); executor.setBeanName("mybean"); executor.setThreadNamePrefix("mytask-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); executor.initialize(); List<FutureTask<String>> result = new ArrayList<>(); for (int i = 0; i < 5; i++) { FutureTask<String> futureTask = new FutureTask<>(() -> { System.out.println("hello world!"); Thread.sleep(200); return "hello "+Thread.currentThread().getName(); }); executor.submit(futureTask); result.add(futureTask); } for (FutureTask<String> futureTask : result) { try { System.out.println(futureTask.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } ListenableFuture<?> runnable = executor.submitListenable(() -> { Thread.sleep(1000); System.out.println("runnable"); return "runnable result"; }); runnable.addCallback(new ListenableFutureCallback<Object>() { @Override public void onFailure(Throwable e) { e.printStackTrace(); } @Override public void onSuccess(Object o) { System.out.println("success "+o.toString()); } }); System.out.println(runnable.get()); executor.shutdown(); } }
結果spring
[INFO] ThreadPoolTaskExecutor - -Initializing ExecutorService 'mybean' hello world! hello world! hello world! hello world! hello mytask-1 hello world! hello mytask-1 hello mytask-2 hello mytask-3 hello mytask-4 runnable runnable result [INFO] ThreadPoolTaskExecutor - -Shutting down ExecutorService 'mybean' success runnable result
@Async
註解實現的線程池就是用的它,我以爲這個可能更加直觀且功能豐富,特別當你須要異步處理事件的時候