簡單使用線程池

線程池的概念

在java中提供了Executors類, 用來創建線程池, 大體分爲如下幾類:

    1. 創建一個固定大小的線程池
static ExecutorService newFixedThreadPool(int nThreads);
    1. 創建一個可緩存的線程池(可大可小)
static ExecutorService newCachedThreadPool()  
    1. 創建一個定時執行的線程池
    • scheduleAtFixedRate()
    • scheduleWithFixedDelay()
    • 區別:
      • scheduleAtFixedRate 固定週期執行, 不管上次的線程執行完成沒有
      • scheduleWithFixedDelay 固定週期執行, 此方法會等待上次線程執行完成後按照週期執行
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)  
    1. 創建一個單線程執行的線程池
static ExecutorService newSingleThreadExecutor()  
    1. 創建一個單線程定時執行的線程池
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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章