線程池的概念
在java中提供了Executors類, 用來創建線程池, 大體分爲如下幾類:
-
- 創建一個固定大小的線程池
static ExecutorService newFixedThreadPool(int nThreads);
-
- 創建一個可緩存的線程池(可大可小)
static ExecutorService newCachedThreadPool()
-
- 創建一個定時執行的線程池
- scheduleAtFixedRate()
- scheduleWithFixedDelay()
- 區別:
- scheduleAtFixedRate 固定週期執行, 不管上次的線程執行完成沒有
- scheduleWithFixedDelay 固定週期執行, 此方法會等待上次線程執行完成後按照週期執行
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
-
- 創建一個單線程執行的線程池
static ExecutorService newSingleThreadExecutor()
-
- 創建一個單線程定時執行的線程池
static ScheduledExecutorService newSingleThreadScheduledExecutor()
- 代碼如下
public static void testFixedThreadPool() {
//創建固定的線程池,使用3個線程來併發執行提交的任務。底層是個無界隊列
ExecutorService executorService = Executors.newFixedThreadPool(6);
executorService.execute(new MyThread());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyThread());
executorService.execute(new MyThread());
}
public static void testCacheThreadPool() {
//創建非固定數量,可緩存的線程池。當提交的任務數量起起伏伏時,會自動創建或者減少執行線程的數量。
//當然,重用線程是線程池的基本特徵。
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new MyThread());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyThread());
}
public static void testScheduledThreadPool(){
//創建一個定時執行線程池
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(30);
//1、配置任務的執行週期
//scheduleAtFixedRate 固定週期執行完畢
//每秒鐘會調用MyRunnable任務, 不管這個MyRunnable有沒有執行完成, 都是每秒執行
executorService.scheduleAtFixedRate(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
//scheduleWithFixedDelay 上一次執行完畢之後下一次開始執行
//每秒鐘會調用MyRunnable任務, 當執行下一次任務, 會先上一次的任務有沒有執行完成, 如果沒有, 先等待, 當上一次的任務執行完成以後, 會等待1秒的時候, 執行下一次請求
executorService.scheduleWithFixedDelay(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
}
//----------以下了解即可--------------
public static void testSingleThreadPool() {
//創建單線程,在任務執行時,會依次執行任務。底層是個無界隊列。
ExecutorService executorService = Executors.newSingleThreadExecutor();
//由於這個線程池只有一個線程, 所以以下的任務, 會依次執行
executorService.execute(new MyThread());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyThread());
}
public static void testSingleCacheThreadPool(){
//創建一個單個線程執行的定時器
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
//scheduleAtFixedRate 固定週期執行完畢
//這個也是一個定時執行的線程池, 但是這個線程池中只有一個線程, 如果使用這個方法的話, 那麼如果上一個線程沒有執行完成, 會直接幹掉這個任務嗎, 重新執行任務
executorService.scheduleAtFixedRate(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
//scheduleWithFixedDelay 上一次執行完畢之後下一次開始執行
executorService.scheduleWithFixedDelay(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
}