前言:如果併發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因爲頻繁創建線程和銷燬線程需要時間。那麼有沒有一種辦法使得線程可以複用,就是執行完一個任務,並不被銷燬,而是可以繼續執行其他的任務?在Java中可以通過線程池來達到這樣的效果
1.創建java原生線程池的四種方式
//創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Test("1"));
executorService.execute(new Test("2"));
executorService.execute(new Test("3"));
//創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待
ExecutorService executorService1 = Executors.newFixedThreadPool(2);
executorService1.execute(new Test("1"));
executorService1.execute(new Test("2"));
executorService1.execute(new Test("3"));
// 創建一個定長線程池,支持定時及週期性任務執行。
ExecutorService executorService2 = Executors.newScheduledThreadPool(2);
executorService2.execute(new Test("1"));
executorService2.execute(new Test("2"));
executorService2.execute(new Test("3"));
//創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行
ExecutorService executorService3 = Executors.newSingleThreadExecutor();
executorService3.execute(new Test("1"));
executorService3.execute(new Test("2"));
executorService3.execute(new Test("3"));
2.創建Spring線程池的方式
@Bean
public ThreadPoolTaskExecutor createThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(20);
return threadPoolTaskExecutor;
}
@注入 taskExecutor
taskExecutor.execute(new Test("3"));