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

首頁 > 開發 > Java > 正文

在spring boot中使用java線程池ExecutorService的講解

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

1. 認識java線程池

1.1 在什么情況下使用線程池?

  • 1.單個任務處理的時間比較短
  • 2.需處理的任務的數量大

1.2 使用線程池的好處:

  • 1.減少在創建和銷毀線程上所花的時間以及系統資源的開銷
  • 2.如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存

1.3 線程池包括以下四個基本組成部分:

  • 1、線程池管理器(ThreadPool):用于創建并管理線程池,包括 創建線程池,銷毀線程池,添加新任務;
  • 2、工作線程(PoolWorker):線程池中線程,在沒有任務時處于等待狀態,可以循環的執行任務;
  • 3、任務接口(Task):每個任務必須實現的接口,以供工作線程調度任務的執行,它主要規定了任務的入口,任務執行完后的收尾工作,任務的執行狀態等;
  • 4、任務隊列(taskQueue):用于存放沒有處理的任務。提供一種緩沖機制。

1.4 線程池的核心參數

ThreadPoolExecutor 有四個構造方法,前三個都是調用最后一個(最后一個參數最全)

 public ThreadPoolExecutor(int corePoolSize,               int maximumPoolSize,               long keepAliveTime,               TimeUnit unit,               BlockingQueue<Runnable> workQueue) {    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,       Executors.defaultThreadFactory(), defaultHandler);  }  public ThreadPoolExecutor(int corePoolSize,               int maximumPoolSize,               long keepAliveTime,               TimeUnit unit,               BlockingQueue<Runnable> workQueue,               ThreadFactory threadFactory) {    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,       threadFactory, defaultHandler);  }  public ThreadPoolExecutor(int corePoolSize,               int maximumPoolSize,               long keepAliveTime,               TimeUnit unit,               BlockingQueue<Runnable> workQueue,               RejectedExecutionHandler handler) {    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,       Executors.defaultThreadFactory(), handler);  }  // 都調用它  public ThreadPoolExecutor(// 核心線程數  int corePoolSize,                // 最大線程數               int maximumPoolSize,                // 閑置線程存活時間               long keepAliveTime,                // 時間單位               TimeUnit unit,                // 線程隊列               BlockingQueue<Runnable> workQueue,                // 線程工廠                ThreadFactory threadFactory,                       // 隊列已滿,而且當前線程數已經超過最大線程數時的異常處理策略                      RejectedExecutionHandler handler  ) {    if (corePoolSize < 0 ||      maximumPoolSize <= 0 ||      maximumPoolSize < corePoolSize ||      keepAliveTime < 0)      throw new IllegalArgumentException();    if (workQueue == null || threadFactory == null || handler == null)      throw new NullPointerException();    this.corePoolSize = corePoolSize;    this.maximumPoolSize = maximumPoolSize;    this.workQueue = workQueue;    this.keepAliveTime = unit.toNanos(keepAliveTime);    this.threadFactory = threadFactory;    this.handler = handler;  }

主要參數

corePoolSize:核心線程數

  • 核心線程會一直存活,即使沒有任務需要執行
  • 當線程數小于核心線程數時,即使有線程空閑,線程池也會優先創建新線程處理
  • 設置allowCoreThreadTimeout=true(默認false)時,核心線程會超時關閉

maxPoolSize:最大線程數

  • 當線程數>=corePoolSize,且任務隊列已滿時。線程池會創建新線程來處理任務
  • 當線程數=maxPoolSize,且任務隊列已滿時,線程池會拒絕處理任務而拋出異常

keepAliveTime:線程空閑時間

  • 當線程空閑時間達到keepAliveTime時,線程會退出,直到線程數量=corePoolSize
  • 如果allowCoreThreadTimeout=true,則會直到線程數量=0

workQueue:一個阻塞隊列,用來存儲等待執行的任務,這個參數的選擇也很重要,會對線程池的運行過程產生重大影響,一般來說,這里的阻塞隊列有以下幾種選擇:

  • ArrayBlockingQueue;
  • LinkedBlockingQueue;
  • SynchronousQueue;

關于阻塞隊列可以看這篇:java 阻塞隊列

threadFactory:線程工廠,主要用來創建線程;

rejectedExecutionHandler:任務拒絕處理器,兩種情況會拒絕處理任務:

  • 當線程數已經達到maxPoolSize,切隊列已滿,會拒絕新任務
  • 當線程池被調用shutdown()后,會等待線程池里的任務執行完畢,再shutdown。如果在調用shutdown()和線程池真正shutdown之間提交任務,會拒絕新任務

當拒絕處理任務時線程池會調用rejectedExecutionHandler來處理這個任務。如果沒有設置默認是AbortPolicy,會拋出異常。ThreadPoolExecutor類有幾個內部實現類來處理這類情況:

  • AbortPolicy 丟棄任務,拋運行時異常
  • CallerRunsPolicy 執行任務
  • DiscardPolicy 忽視,什么都不會發生
  • DiscardOldestPolicy 從隊列中踢出最先進入隊列(最后一個執行)的任務
  • 實現RejectedExecutionHandler接口,可自定義處理器

1.5 Java線程池 ExecutorService

  • Executors.newCachedThreadPool 創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
  • Executors.newFixedThreadPool 創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。
  • Executors.newScheduledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。
  • Executors.newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

備注:Executors只是一個工廠類,它所有的方法返回的都是ThreadPoolExecutor、ScheduledThreadPoolExecutor這兩個類的實例。

1.6 ExecutorService有如下幾個執行方法

  • executorService.execute(Runnable);這個方法接收一個Runnable實例,并且異步的執行
  • executorService.submit(Runnable)
  • executorService.submit(Callable)
  • executorService.invokeAny(…)
  • executorService.invokeAll(…)

execute(Runnable)

這個方法接收一個Runnable實例,并且異步的執行

executorService.execute(new Runnable() {public void run() {  System.out.println("Asynchronous task");}});executorService.shutdown();

submit(Runnable)

submit(Runnable)和execute(Runnable)區別是前者可以返回一個Future對象,通過返回的Future對象,我們可以檢查提交的任務是否執行完畢,請看下面執行的例子:

Future future = executorService.submit(new Runnable() {public void run() {  System.out.println("Asynchronous task");}});future.get(); //returns null if the task has finished correctly.

submit(Callable)

submit(Callable)和submit(Runnable)類似,也會返回一個Future對象,但是除此之外,submit(Callable)接收的是一個Callable的實現,Callable接口中的call()方法有一個返回值,可以返回任務的執行結果,而Runnable接口中的run()方法是void的,沒有返回值。請看下面實例:

Future future = executorService.submit(new Callable(){public Object call() throws Exception {  System.out.println("Asynchronous Callable");  return "Callable Result";}});System.out.println("future.get() = " + future.get());

如果任務執行完成,future.get()方法會返回Callable任務的執行結果。注意,future.get()方法會產生阻塞。

invokeAny(…)

invokeAny(…)方法接收的是一個Callable的集合,執行這個方法不會返回Future,但是會返回所有Callable任務中其中一個任務的執行結果。這個方法也無法保證返回的是哪個任務的執行結果,反正是其中的某一個。

ExecutorService executorService = Executors.newSingleThreadExecutor();Set<Callable<String>> callables = new HashSet<Callable<String>>();callables.add(new Callable<String>() {public String call() throws Exception {  return "Task 1";}});callables.add(new Callable<String>() {public String call() throws Exception {  return "Task 2";}});callables.add(new Callable<String>() {  public String call() throws Exception {  return "Task 3";}});String result = executorService.invokeAny(callables);System.out.println("result = " + result);executorService.shutdown();

invokeAll(…)

invokeAll(…)與 invokeAny(…)類似也是接收一個Callable集合,但是前者執行之后會返回一個Future的List,其中對應著每個Callable任務執行后的Future對象。

List<Future<String>> futures = executorService.invokeAll(callables);for(Future<String> future : futures){System.out.println("future.get = " + future.get());}executorService.shutdown();

2. 在springBoot中使用java線程池ExecutorService

2.1 springBoot 的使用配置

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * 數據收集配置,主要作用在于Spring啟動時自動加載一個ExecutorService對象. * @author Bruce * @date 2017/2/22 * update by Cliff at 2027/11/03 */@Configurationpublic class ThreadPoolConfig {  @Bean  public ExecutorService getThreadPool(){    return Executors.newFixedThreadPool();  }}

2.2 使用

在@service 中注入 ExecutorService 然后就可以直接用了。  @Autowired  private ExecutorService executorService;public void test(){    executorService.execute(new Runnable() {      public void run() {        System.out.println("Asynchronous task");      }    });  }

總結

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产亚洲精品久久久8v| 亚洲国产精品久久精品怡红院| 精品久久久久久久久久久久| 亚洲精品自拍视频| 欧美黑人巨大精品一区二区| 亚洲精品456在线播放狼人| 久久久电影免费观看完整版| 2025国产精品视频| 成人精品一区二区三区电影免费| 日韩电影免费观看在线| 国产视频精品自拍| 亚洲精品www久久久久久广东| 国产日韩欧美日韩大片| 亚洲天天在线日亚洲洲精| 日韩美女av在线免费观看| 日韩女在线观看| 亚洲美女视频网站| 色午夜这里只有精品| 国产精品久久久久久亚洲影视| 国产区精品在线观看| 日韩中文字幕第一页| 日韩av免费在线播放| 成人免费黄色网| 成人黄色免费网站在线观看| 亚洲男人天天操| 国产一区二区欧美日韩| 精品成人乱色一区二区| 久久成人这里只有精品| 青草青草久热精品视频在线观看| 亚洲xxxxx电影| 国产精品久久一区主播| 91在线播放国产| 国产精品wwwwww| 亚洲人成网站免费播放| 国产美女精品免费电影| 亚洲sss综合天堂久久| 欧美亚洲免费电影| 亚洲精品美女视频| 成人国产精品久久久久久亚洲| 亚洲成avwww人| 精品偷拍各种wc美女嘘嘘| 欧美激情综合亚洲一二区| 奇米四色中文综合久久| 成人激情视频小说免费下载| 亚洲欧洲国产一区| 欧美性理论片在线观看片免费| 国产丝袜视频一区| 日韩国产欧美区| 欧美日韩激情视频| 中日韩午夜理伦电影免费| 国产这里只有精品| 亚洲xxxx3d| 两个人的视频www国产精品| 久久天天躁狠狠躁夜夜av| 日韩大陆欧美高清视频区| 亚洲91精品在线观看| 日本国产精品视频| 夜夜嗨av一区二区三区免费区| 亚洲国产精品嫩草影院久久| 一区二区三区国产视频| 中文欧美日本在线资源| 亚洲天堂久久av| 日韩av一区在线| 久久久女人电视剧免费播放下载| 亚洲伊人成综合成人网| 亚洲色无码播放| 久久久精品在线观看| 成人久久一区二区三区| 日本一本a高清免费不卡| 欧美日韩中国免费专区在线看| 日韩成人在线观看| 亚洲综合中文字幕68页| 日本老师69xxx| 日韩成人激情视频| 国内精品久久久久久久| 91久久精品国产91久久| 在线色欧美三级视频| 91国产美女视频| 亚洲欧美制服中文字幕| 国产日韩欧美一二三区| 91国内揄拍国内精品对白| 九九热在线精品视频| 国产精品直播网红| 国产欧美精品在线播放| 中文字幕亚洲欧美| 国产精品免费视频久久久| 欧美主播福利视频| 96pao国产成视频永久免费| 不卡av日日日| 97精品视频在线播放| 岛国av午夜精品| 日本成人免费在线| 久久久久久久久国产精品| 欧美激情精品久久久久久大尺度| 国产欧美精品一区二区| 国产999视频| 尤物tv国产一区| xxx一区二区| 日韩在线免费视频观看| 海角国产乱辈乱精品视频| 国产精品人成电影在线观看| 国产精品自拍视频| 伊人伊成久久人综合网小说| 国产小视频国产精品| 日韩女优在线播放| 久久久久久伊人| 亚洲精品午夜精品| 毛片精品免费在线观看| 精品毛片三在线观看| 国外日韩电影在线观看| 日产日韩在线亚洲欧美| 欧美在线亚洲一区| 国产精品成人品| 久久久99久久精品女同性| 成人在线观看视频网站| 91久久久久久国产精品| 午夜精品久久久久久久99热| 亚洲欧美成人一区二区在线电影| 日韩精品免费在线视频| 日韩免费不卡av| 综合欧美国产视频二区| 国产一区二区三区视频在线观看| 91国内在线视频| 国产精品久久久久久久久久新婚| 全色精品综合影院| 国产91精品久久久久久久| 亚洲最新av在线网站| 国产一区玩具在线观看| 日本久久中文字幕| 91精品久久久久久久久久入口| 狠狠躁18三区二区一区| 亚洲а∨天堂久久精品9966| 视频在线一区二区| 日韩视频在线免费| 欧美日韩国产123| 91国产美女视频| 欧美激情第一页xxx| 欧美日韩国产综合视频在线观看中文| 成人网中文字幕| 亚洲日韩中文字幕| yw.139尤物在线精品视频| 91老司机精品视频| 97激碰免费视频| 欧美激情a在线| 久久久国产精品x99av| 米奇精品一区二区三区在线观看| 尤物九九久久国产精品的特点| 久久久91精品国产一区不卡| 国产综合在线视频| 精品一区二区三区电影| 欧美视频一二三| 国产精品成久久久久三级| 亚洲国产另类 国产精品国产免费| 精品小视频在线| 一二美女精品欧洲| 亚洲香蕉av在线一区二区三区| 91高清视频在线免费观看| 黑人与娇小精品av专区| 北条麻妃久久精品| 国产成人福利网站| 高清亚洲成在人网站天堂| 91国产精品电影| 91欧美精品成人综合在线观看| 日韩乱码在线视频|