ThreadPoolTaskExecutor學習

1. ThreadPoolTaskExecutor學習

1.1. 前言

  • 咱們知道通常建立線程池,咱們都用ThreadPoolExecutor,但實際上Spring它也對該線程池作了一層封裝,他就是ThreadPoolTaskExecutor

1.2. 代碼例子

  • 它的建立方式也很簡單,各個屬性直接經過set設置屬性值,最後調用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

1.3. 總結

  • 當使用線程池時,能夠考慮直接使用spring封裝的線程池,前一篇@Async註解實現的線程池就是用的它,我以爲這個可能更加直觀且功能豐富,特別當你須要異步處理事件的時候
相關文章
相關標籤/搜索