亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

線程池ThreadPoolExecutor使用簡介與方法實例

2024-07-14 08:43:47
字體:
來源:轉載
供稿:網友

一、簡介

線程池類為 java.util.concurrent.ThreadPoolExecutor,常用構造方法為:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) 
  • corePoolSize: 線程池維護線程的最少數量
  • maximumPoolSize:線程池維護線程的最大數量
  • keepAliveTime: 線程池維護線程所允許的空閑時間
  • unit: 線程池維護線程所允許的空閑時間的單位
  • workQueue: 線程池所使用的緩沖隊列
  • handler: 線程池對拒絕任務的處理策略

一個任務通過 execute(Runnable)方法被添加到線程池,任務就是一個 Runnable類型的對象,任務的執行方法就是 Runnable類型對象的run()方法。

當一個任務通過execute(Runnable)方法欲添加到線程池時:

  • 如果此時線程池中的數量小于corePoolSize,即使線程池中的線程都處于空閑狀態,也要創建新的線程來處理被添加的任務。
  • 如果此時線程池中的數量等于 corePoolSize,但是緩沖隊列 workQueue未滿,那么任務被放入緩沖隊列。
  • 如果此時線程池中的數量大于corePoolSize,緩沖隊列workQueue滿,并且線程池中的數量小于maximumPoolSize,建新的線程來處理被添加的任務。
  • 如果此時線程池中的數量大于corePoolSize,緩沖隊列workQueue滿,并且線程池中的數量等于maximumPoolSize,那么通過 handler所指定的策略來處理此任務。

也就是:處理任務的優先級為:

核心線程corePoolSize、任務隊列workQueue、最大線程maximumPoolSize,如果三者都滿了,使用handler處理被拒絕的任務。

當線程池中的線程數量大于 corePoolSize時,如果某線程空閑時間超過keepAliveTime,線程將被終止。這樣,線程池可以動態的調整池中的線程數。

unit可選的參數為java.util.concurrent.TimeUnit中的幾個靜態屬性:

NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。

workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue

handler有四個選擇:

  • ThreadPoolExecutor.AbortPolicy() 拋出java.util.concurrent.RejectedExecutionException異常
  • ThreadPoolExecutor.CallerRunsPolicy() 重試添加當前的任務,他會自動重復調用execute()方法
  • ThreadPoolExecutor.DiscardOldestPolicy() 拋棄舊的任務
  • ThreadPoolExecutor.DiscardPolicy() 拋棄當前的任務

二、一般用法舉例

package demo;import java.io.Serializable;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class TestThreadPool2{  private static int produceTaskSleepTime = 2;  private static int produceTaskMaxNumber = 10;  public static void main(String[] args)  {    // 構造一個線程池    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),        new ThreadPoolExecutor.DiscardOldestPolicy());    for (int i = 1; i <= produceTaskMaxNumber; i++)    {      try      {        // 產生一個任務,并將其加入到線程池        String task = "task@ " + i;        System.out.println("put " + task);        threadPool.execute(new ThreadPoolTask(task));        // 便于觀察,等待一段時間        Thread.sleep(produceTaskSleepTime);      }      catch (Exception e)      {        e.printStackTrace();      }    }  }}/** * 線程池執行的任務 */class ThreadPoolTask implements Runnable, Serializable{  private static final long serialVersionUID = 0;  private static int consumeTaskSleepTime = 2000;  // 保存任務所需要的數據  private Object threadPoolTaskData;  ThreadPoolTask(Object tasks)  {    this.threadPoolTaskData = tasks;  }  public void run()  {    // 處理一個任務,這里的處理方式太簡單了,僅僅是一個打印語句    System.out.println(Thread.currentThread().getName());    System.out.println("start .." + threadPoolTaskData);    try    {      // //便于觀察,等待一段時間      Thread.sleep(consumeTaskSleepTime);    }    catch (Exception e)    {      e.printStackTrace();    }    threadPoolTaskData = null;  }  public Object getTask()  {    return this.threadPoolTaskData;  }}

說明:

1、在這段程序中,一個任務就是一個Runnable類型的對象,也就是一個ThreadPoolTask類型的對象。

2、一般來說任務除了處理方式外,還需要處理的數據,處理的數據通過構造方法傳給任務。

3、在這段程序中,main()方法相當于一個殘忍的領導,他派發出許多任務,丟給一個叫 threadPool的任勞任怨的小組來做。

這個小組里面隊員至少有兩個,如果他們兩個忙不過來,任務就被放到任務列表里面。

如果積壓的任務過多,多到任務列表都裝不下(超過3個)的時候,就雇傭新的隊員來幫忙。但是基于成本的考慮,不能雇傭太多的隊員,至多只能雇傭 4個。

如果四個隊員都在忙時,再有新的任務,這個小組就處理不了了,任務就會被通過一種策略來處理,我們的處理方式是不停的派發,直到接受這個任務為止(更殘忍!呵呵)。

因為隊員工作是需要成本的,如果工作很閑,閑到 3SECONDS都沒有新的任務了,那么有的隊員就會被解雇了,但是,為了小組的正常運轉,即使工作再閑,小組的隊員也不能少于兩個。

4、通過調整 produceTaskSleepTime和 consumeTaskSleepTime的大小來實現對派發任務和處理任務的速度的控制,改變這兩個值就可以觀察不同速率下程序的工作情況。

5、通過調整4中所指的數據,再加上調整任務丟棄策略,換上其他三種策略,就可以看出不同策略下的不同處理方式。

6、對于其他的使用方法,參看jdk的幫助,很容易理解和使用。

另一個例子:

package demo;import java.util.Queue;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ThreadPoolExecutorTest{  private static int queueDeep = 4;  public void createThreadPool()  {    /*      * 創建線程池,最小線程數為2,最大線程數為4,線程池維護線程的空閑時間為3秒,      * 使用隊列深度為4的有界隊列,如果執行程序尚未關閉,則位于工作隊列頭部的任務將被刪除,      * 然后重試執行程序(如果再次失敗,則重復此過程),里面已經根據隊列深度對任務加載進行了控制。      */     ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 4, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueDeep),        new ThreadPoolExecutor.DiscardOldestPolicy());    // 向線程池中添加 10 個任務    for (int i = 0; i < 10; i++)    {      try      {        Thread.sleep(1);      }      catch (InterruptedException e)      {        e.printStackTrace();      }      while (getQueueSize(tpe.getQueue()) >= queueDeep)      {        System.out.println("隊列已滿,等3秒再添加任務");        try        {          Thread.sleep(3000);        }        catch (InterruptedException e)        {          e.printStackTrace();        }      }      TaskThreadPool ttp = new TaskThreadPool(i);      System.out.println("put i:" + i);      tpe.execute(ttp);    }    tpe.shutdown();  }  private synchronized int getQueueSize(Queue queue)  {    return queue.size();  }  public static void main(String[] args)  {    ThreadPoolExecutorTest test = new ThreadPoolExecutorTest();    test.createThreadPool();  }  class TaskThreadPool implements Runnable  {    private int index;    public TaskThreadPool(int index)    {      this.index = index;    }    public void run()    {      System.out.println(Thread.currentThread() + " index:" + index);      try      {        Thread.sleep(3000);      }      catch (InterruptedException e)      {        e.printStackTrace();      }    }  }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产第一区电影| 午夜精品一区二区三区在线播放| 久久av.com| 91精品国产91久久久久福利| 岛国av一区二区| 欧美日韩国产综合新一区| 国语自产在线不卡| 日韩一区视频在线| 欧美午夜激情在线| 欧美一级视频免费在线观看| 色yeye香蕉凹凸一区二区av| 国产精品第一第二| 亚洲丝袜一区在线| 成人精品视频久久久久| 亚洲欧美国内爽妇网| 精品成人在线视频| 久久久www成人免费精品| 久久伊人免费视频| 久久久久久97| 欧美激情精品久久久| 中文字幕久热精品在线视频| 91精品国产91久久久久久吃药| 欧美日韩在线第一页| 久久久精品国产一区二区| 欧美成人午夜激情在线| 中文字幕v亚洲ⅴv天堂| 久久6精品影院| 77777少妇光屁股久久一区| 欧美美最猛性xxxxxx| 午夜精品一区二区三区在线| 两个人的视频www国产精品| 91精品视频免费| 欧美电影在线观看| 欧亚精品中文字幕| 欧洲精品毛片网站| 国产亚洲aⅴaaaaaa毛片| 久久精品国产电影| 中文字幕亚洲一区二区三区| 久久精品人人爽| 欧美激情精品久久久| 久久精品国产久精国产一老狼| 狠狠躁18三区二区一区| 国产精品久久久久久av福利软件| 97人人爽人人喊人人模波多| 日本久久中文字幕| 国产精品久久久久久久9999| 国内精品国产三级国产在线专| 国产一区二区三区高清在线观看| 国产福利精品av综合导导航| 亚洲一区二区免费| 国产精品第3页| 日韩精品视频中文在线观看| 欧美一乱一性一交一视频| 亚洲精品91美女久久久久久久| 国产欧美韩国高清| 日韩三级成人av网| 成人午夜小视频| 亚洲图片在线综合| 亚洲欧美资源在线| 欧美激情久久久| 久久精品亚洲94久久精品| 亚洲成色777777在线观看影院| 欧美视频中文字幕在线| 在线观看欧美视频| 韩国三级日本三级少妇99| 久久久久免费精品国产| 日韩久久免费电影| 国产成人精品在线视频| 亚洲一区二区三区四区视频| 日韩精品视频免费在线观看| 国产欧美久久一区二区| 欧美日韩国产一区中文午夜| 久久久在线观看| 国产成人精品一区二区在线| 欧美一级电影久久| 日韩国产精品亚洲а∨天堂免| 97精品视频在线播放| 欧美激情亚洲视频| 久久视频在线播放| 91精品国产91| 欧美激情videos| 国产精品678| 精品久久久久久久大神国产| 国产精品露脸自拍| 在线精品国产欧美| 欧美精品18videosex性欧美| 萌白酱国产一区二区| 亚洲国内高清视频| 亚洲专区中文字幕| 538国产精品一区二区在线| 日本人成精品视频在线| 中文字幕在线观看亚洲| 少妇激情综合网| 97免费中文视频在线观看| 中文字幕亚洲无线码a| 97久久国产精品| 国产精品久久久久久久久久久久| 91中文在线视频| 亚洲国产精品一区二区三区| 亚洲精品98久久久久久中文字幕| 少妇高潮久久久久久潘金莲| 亚洲欧美一区二区三区久久| 97涩涩爰在线观看亚洲| 一本一道久久a久久精品逆3p| 国产亚洲精品高潮| 久久男人的天堂| 日韩成人在线播放| 亚洲人成欧美中文字幕| 欧美国产欧美亚洲国产日韩mv天天看完整| 日本精品一区二区三区在线播放视频| 亚洲欧美一区二区三区四区| 亚洲成人精品视频| 中文在线资源观看视频网站免费不卡| 欧美黄网免费在线观看| 国产亚洲一区二区在线| 久热国产精品视频| 久久国产精品久久久久久久久久| 中文国产成人精品久久一| 在线看福利67194| 国产69久久精品成人| 亚洲成人免费在线视频| 精品久久久国产精品999| 国产偷亚洲偷欧美偷精品| 亚洲免费小视频| 国产一区视频在线| 97精品国产97久久久久久免费| 国产精品永久免费视频| 久久中文字幕在线视频| 亚洲a在线观看| 亚洲精品wwwww| 国产精品久久久久久婷婷天堂| 欧美二区乱c黑人| 欧美不卡视频一区发布| 免费91在线视频| 欧美多人乱p欧美4p久久| 色噜噜亚洲精品中文字幕| 欧美精品激情在线观看| 亚洲美女av电影| 国产精品91在线| 清纯唯美亚洲激情| 欧美午夜www高清视频| 亚洲小视频在线观看| 欧美大肥婆大肥bbbbb| 日本精品久久久久久久| 国外色69视频在线观看| 亚洲黄色片网站| 宅男66日本亚洲欧美视频| 伊人成人开心激情综合网| 国产精品中文久久久久久久| 91九色视频在线| 久久久免费精品| 亚洲人午夜精品免费| 91精品视频免费观看| 欧美日韩中文字幕综合视频| 国产精品一香蕉国产线看观看| 欧美视频精品一区| 91久久久国产精品| 懂色aⅴ精品一区二区三区蜜月| 97超碰国产精品女人人人爽| 国产欧美亚洲精品| 国产精品露脸av在线| 91网站免费观看| 国产成人午夜视频网址| 欧美成人在线影院|