麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > Java > 正文

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

2024-07-14 08:43:37
字體:
供稿:網(wǎng)友

1. 認識java線程池

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

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

1.2 使用線程池的好處:

  • 1.減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷
  • 2.如不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量線程而導(dǎo)致消耗完系統(tǒng)內(nèi)存

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

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

1.4 線程池的核心參數(shù)

ThreadPoolExecutor 有四個構(gòu)造方法,前三個都是調(diào)用最后一個(最后一個參數(shù)最全)

 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);  }  // 都調(diào)用它  public ThreadPoolExecutor(// 核心線程數(shù)  int corePoolSize,                // 最大線程數(shù)               int maximumPoolSize,                // 閑置線程存活時間               long keepAliveTime,                // 時間單位               TimeUnit unit,                // 線程隊列               BlockingQueue<Runnable> workQueue,                // 線程工廠                ThreadFactory threadFactory,                       // 隊列已滿,而且當(dāng)前線程數(shù)已經(jīng)超過最大線程數(shù)時的異常處理策略                      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;  }

主要參數(shù)

corePoolSize:核心線程數(shù)

  • 核心線程會一直存活,即使沒有任務(wù)需要執(zhí)行
  • 當(dāng)線程數(shù)小于核心線程數(shù)時,即使有線程空閑,線程池也會優(yōu)先創(chuàng)建新線程處理
  • 設(shè)置allowCoreThreadTimeout=true(默認false)時,核心線程會超時關(guān)閉

maxPoolSize:最大線程數(shù)

  • 當(dāng)線程數(shù)>=corePoolSize,且任務(wù)隊列已滿時。線程池會創(chuàng)建新線程來處理任務(wù)
  • 當(dāng)線程數(shù)=maxPoolSize,且任務(wù)隊列已滿時,線程池會拒絕處理任務(wù)而拋出異常

keepAliveTime:線程空閑時間

  • 當(dāng)線程空閑時間達到keepAliveTime時,線程會退出,直到線程數(shù)量=corePoolSize
  • 如果allowCoreThreadTimeout=true,則會直到線程數(shù)量=0

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

  • ArrayBlockingQueue;
  • LinkedBlockingQueue;
  • SynchronousQueue;

關(guān)于阻塞隊列可以看這篇:java 阻塞隊列

threadFactory:線程工廠,主要用來創(chuàng)建線程;

rejectedExecutionHandler:任務(wù)拒絕處理器,兩種情況會拒絕處理任務(wù):

  • 當(dāng)線程數(shù)已經(jīng)達到maxPoolSize,切隊列已滿,會拒絕新任務(wù)
  • 當(dāng)線程池被調(diào)用shutdown()后,會等待線程池里的任務(wù)執(zhí)行完畢,再shutdown。如果在調(diào)用shutdown()和線程池真正shutdown之間提交任務(wù),會拒絕新任務(wù)

當(dāng)拒絕處理任務(wù)時線程池會調(diào)用rejectedExecutionHandler來處理這個任務(wù)。如果沒有設(shè)置默認是AbortPolicy,會拋出異常。ThreadPoolExecutor類有幾個內(nèi)部實現(xiàn)類來處理這類情況:

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

1.5 Java線程池 ExecutorService

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

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

1.6 ExecutorService有如下幾個執(zhí)行方法

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

execute(Runnable)

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

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

submit(Runnable)

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

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的實現(xiàn),Callable接口中的call()方法有一個返回值,可以返回任務(wù)的執(zhí)行結(jié)果,而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());

如果任務(wù)執(zhí)行完成,future.get()方法會返回Callable任務(wù)的執(zhí)行結(jié)果。注意,future.get()方法會產(chǎn)生阻塞。

invokeAny(…)

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

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集合,但是前者執(zhí)行之后會返回一個Future的List,其中對應(yīng)著每個Callable任務(wù)執(zhí)行后的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;/** * 數(shù)據(jù)收集配置,主要作用在于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");      }    });  }

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: v11av在线视频成人 | 鲁人人人鲁人人鲁精品 | 精品久久中文网址 | 欧美另类视频在线 | 黄色片视频观看 | 精品一区二区久久久久久按摩 | 福利在线免费视频 | 91精选视频 | 成人免费精品视频 | 国产伦精品一区二区三区 | 欧美一级美国一级 | 校花被肉干高h潮不断 | 亚洲骚综合 | 久久久久久久亚洲精品 | 国产pron| 毛片大全| 国产日韩欧美一区 | 久久精品国产99国产精品澳门 | 精品国产一区二区三区四区在线 | 久久精品在线免费观看 | 国产99一区二区 | 免费看一级片 | 一区二区三区在线视频观看58 | 在线影院av | 精品一二三区视频 | 国产资源在线免费观看 | 涩涩激情网 | 欧美成年性h版影视中文字幕 | 欧美国产综合视频 | 性高湖久久久久久久久aaaaa | 国产成人精品网站 | 国产日韩a| 一本到免费视频 | 欧美日穴视频 | 精品久久久久久综合日本 | 一级做a爱片久久 | 天天黄色片| 国产一级aaa全黄毛片 | 一级做a爱视频 | h视频在线免费观看 | 毛片在哪里看 |