欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java中的線程池

 更新時間:2019年03月21日 11:18:37   作者:辣雞小籃子  
這篇文章主要介紹了Java中的線程池,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.簡介

使用線程池可以避免線程的頻繁創(chuàng)建以及銷毀。

JAVA中提供的用于實現(xiàn)線程池的API:

Executor、ExecutorService、AbstractExecutorService、ThreadPoolExecutor、ForkJoinPool都位于java.util.concurrent包下。

*ThreadPoolExecutor、ForkJoinPool為線程池的實現(xiàn)類。

2.Executor

public interface Executor {

  /**
   * 向線程池提交一個任務(wù),交由線程池去執(zhí)行
   */
  void execute(Runnable command);

}

*該接口聲明了execute(Runnable command)方法,負(fù)責(zé)向線程池中提交一個任務(wù)。

3.ExecutorService接口

public interface ExecutorService extends Executor {

  /**
   * 關(guān)閉線程池(等待隊列中的任務(wù)被執(zhí)行完畢)
   */
  void shutdown();

  /**
   * 立刻關(guān)閉線程池(不執(zhí)行隊列中的任務(wù),并嘗試中斷當(dāng)前執(zhí)行的任務(wù))
   */
  List<Runnable> shutdownNow();

  /**
   * 判斷線程池是否處于shutdown狀態(tài).
   */
  boolean isShutdown();

  /**
   * 判斷線程池是否處于terminated狀態(tài).
   */
  boolean isTerminated();

  /**
   * 若在指定時間內(nèi)線程池處于terminated狀態(tài)則立即返回true,否則超過時間后仍未為terminated狀態(tài)則返回false.
   */
  boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

  /**
   * 向線程池提交一個任務(wù)并返回包含指定類型的Future(根據(jù)Callable的泛型)
   */
  <T> Future<T> submit(Callable<T> task);

  /**
   * 向線程池提交一個任務(wù)并指定任務(wù)執(zhí)行結(jié)果的類型,返回包含指定類型的Future.
   */
  <T> Future<T> submit(Runnable task, T result);

  /**
   * 向線程池提交一個任務(wù)并返回未知類型的Future.
   */
  Future<?> submit(Runnable task);

  /**
   * 向線程池提交多個任務(wù)并返回指定類型的Future列表.
   */
  <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;

  /**
   * 向線程池提交多個任務(wù)并返回指定類型的Future列表,如果在指定時間內(nèi)沒有執(zhí)行完畢則直接返回.
   */
  <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException;
   
  /**
   * 向線程池提交多個任務(wù),當(dāng)任意一個任務(wù)執(zhí)行完畢后返回指定類型的Future.
   */
  <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;

  /**
   * 向線程池提交多個任務(wù),在指定時間內(nèi),當(dāng)任意一個任務(wù)執(zhí)行完畢后返回指定類型的Future,若超時則拋出異常.
   */
  <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
public interface Future<V> {

  /**
   * 中斷任務(wù)的執(zhí)行
   */
  boolean cancel(boolean mayInterruptIfRunning);

  /**
   * 判斷任務(wù)是否中斷成功
   */
  boolean isCancelled();

  /**
   * 判斷任務(wù)是否執(zhí)行完成
   */
  boolean isDone();
  
  /**
   * 獲取任務(wù)的執(zhí)行結(jié)果直到任務(wù)執(zhí)行完畢(阻塞線程)
   */
  V get() throws InterruptedException, ExecutionException;
 
  /**
   * 獲取任務(wù)的執(zhí)行結(jié)果,若在指定時間內(nèi)任務(wù)仍然沒有執(zhí)行完畢則拋出TimeoutException
   */
  V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}

*execute()方法不能獲取任務(wù)的執(zhí)行結(jié)果,而submit()方法能夠根據(jù)返回的Future實例獲取任務(wù)的執(zhí)行結(jié)果。

4.ThreadPoolExecutor

corePoolSize:線程池中核心線程的數(shù)量。

maximumPoolSize:線程池中最大線程數(shù)。

keepAliveTime:線程的空閑時間。

unit:修飾線程空閑時間的單位。

workQueue:任務(wù)隊列。

threadFactory:線程工廠,用于創(chuàng)建線程。

handler:當(dāng)隊列已滿且當(dāng)前線程數(shù)已達(dá)到所允許的最大值時的處理策略。

*線程池中的線程包括核心線程以及普通線程,核心線程一旦創(chuàng)建后直到線程池被關(guān)閉前都就不會被銷毀,而普通線程會因為到達(dá)空閑時間而被銷毀。

構(gòu)造方法:

public ThreadPoolExecutor(int corePoolSize,
             int maximumPoolSize,
             long keepAliveTime,
             TimeUnit unit,
             BlockingQueue<Runnable> workQueue,
             ThreadFactory threadFactory,
             RejectedExecutionHandler handler)

BlockingQueue的類型 

 BlockingQueue提供了ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等實現(xiàn)類。

1.ArrayBlockingQueue:使用順序表的結(jié)構(gòu)進(jìn)行存儲,在使用時需要指定其長度,支持公平鎖/非公平鎖進(jìn)行操作。

2.LinkedBlockingQueue:使用鏈表的結(jié)構(gòu)進(jìn)行存儲,在使用時不需要指定其長度,隊列的最大長度為Integer.MAX_VALUE。

3.SynchronousQueue:一個不存儲元素的隊列,每一個put操作必須等待take操作,否則不能添加元素,支持公平鎖和非公平鎖。

 *這些實現(xiàn)類在進(jìn)行入隊和出隊操作時都會進(jìn)行加鎖,以保證在多線程并發(fā)訪問時數(shù)據(jù)的安全性。

隊列已滿且線程數(shù)已達(dá)到所允許的最大值時的處理策略

RejectedExecutionHandler提供了AbortPolicy、DiscardPolicy、DiscardOlderstPolicy、CallerRunsPolicy四個策略,這四個策略都是ThreadPoolExecutor的靜態(tài)內(nèi)部類。

1.AbortPolicy:放棄任務(wù)并拋出RejectedExecutionException異常。

2.DiscardPolicy:放棄任務(wù)但不拋出異常。

3.DiscardOlderstPolicy: 放棄隊頭中的任務(wù),然后重新嘗試執(zhí)行新任務(wù)。

4.CallerRunsPolicy: 由調(diào)用線程來處理該任務(wù)。

線程池的狀態(tài)

private static final int RUNNING  = -1;
private static final int SHUTDOWN  = 0; 
private static final int STOP    = 1;
private static final int TIDYING  = 2; 
private static final int TERMINATED = 3;

1.RUNING:線程池處于運行狀態(tài),此時可以接受新的任務(wù)請求,并且執(zhí)行隊列中的任務(wù)。

2.SHUTDOWN:線程池處于關(guān)閉狀態(tài),此時不接受新的任務(wù)請求,但會繼續(xù)執(zhí)行隊列中的任務(wù)。

3.STOP:線程池處于禁用狀態(tài),此時不接受新的任務(wù)請求,并且不會執(zhí)行隊列中的任務(wù)。

4.TIDYING:線程池處于整理狀態(tài),此時沒有正在執(zhí)行的任務(wù)。

5.TERMINATED :線程池處于終止?fàn)顟B(tài)。

線程池狀態(tài)的變化過程

1.當(dāng)線程池創(chuàng)建后處于RUNNING狀態(tài)。

2.1 若此時調(diào)用了shutdown()方法,那么線程池將處于SHUTDOWN狀態(tài),不接受新的任務(wù)請求,但會繼續(xù)執(zhí)行隊列中的任務(wù),當(dāng)隊列中的任務(wù)為空且沒有正在執(zhí)行的任務(wù)時,線程池的狀態(tài)為TIDYING。

2.2 若此時調(diào)用了shutdownNow()方法,那么線程池將處于STOP狀態(tài),不接受新的任務(wù)請求并且不執(zhí)行隊列中的任務(wù),此時線程池的狀態(tài)為TIDYING。

3.當(dāng)線程池的狀態(tài)為TIDYING時,當(dāng)terminated()方法處理完畢后,線程池的狀態(tài)為TRRMINATED。

任務(wù)的執(zhí)行流程

1.當(dāng)調(diào)用了execute()或者submit()方法向線程池提交一個任務(wù)后,首先判斷當(dāng)前線程池中的線程個數(shù)是否大于核心線程數(shù)。

2.如果當(dāng)前線程池的線程個數(shù)小于核心線程數(shù),則創(chuàng)建一個核心線程來處理任務(wù)。

3.如果當(dāng)前線程池的線程個數(shù)大于核心線程數(shù),則將任務(wù)放入到隊列中,如果放入隊列成功,那么該任務(wù)將等待被空閑的線程處理,如果放入隊列失敗(隊滿),則判斷當(dāng)前線程池中的線程個數(shù)是否達(dá)到所允許的最大值,若未達(dá)到則創(chuàng)建一個普通線程去處理任務(wù),否則根據(jù)預(yù)定義的處理策略去進(jìn)行處理。

5.Executors工具類

JAVA中提供了Executors工具類,用于直接創(chuàng)建Executor。

CacheThreadPool

public static ExecutorService newCachedThreadPool() {
  return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}

CacheThreadPool創(chuàng)建的都是普通線程(其核心線程數(shù)為0)、線程池的最大線程數(shù)為Integer.MAX_VALUE、線程的空閑時間為60秒,此方式適合大量耗時短的任務(wù)、不適合大量耗時長的任務(wù)。

*由于創(chuàng)建的都是普通線程,且空閑時間為60秒,則仍有可能會頻繁的創(chuàng)建線程。

FixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads) {
  return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}

FixedThreadPool創(chuàng)建的都是核心線程,其線程個數(shù)由入?yún)Q定,線程不會因為空閑時間而被銷毀,適合預(yù)知任務(wù)數(shù)量的業(yè)務(wù)。

SingleThreadExecutor

public static ExecutorService newSingleThreadExecutor() {
  return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,new LinkedBlockingQueue<Runnable>()));
}

SingleThreadExecutor使用一個核心線程來處理任務(wù)。

ScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
    return new ScheduledThreadPoolExecutor(corePoolSize);
}

*ScheduledThreadPool支持定時執(zhí)行任務(wù)以及固定間隔執(zhí)行任務(wù)。

SingleThreadScheduledExecutor

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
    return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}

*SingleThreadScheduledExecutor支持一個線程的定時執(zhí)行任務(wù)以及固定間隔執(zhí)行任務(wù)。

public interface ScheduledExecutorService extends ExecutorService {

  /**
   * 在指定的延遲時間到達(dá)后執(zhí)行任務(wù)一次
   */
  public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);

  /**
   * 在指定的延遲時間到達(dá)后執(zhí)行任務(wù)一次
   */
  public <V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit);

  /**
   * 在指定的初始化延遲時間到達(dá)后執(zhí)行任務(wù)一次,往后每隔period時間執(zhí)行任務(wù)一次.
   */
  public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit);

  /**
   * 在指定的初始化延遲時間到達(dá)后執(zhí)行任務(wù)一次,往后每次任務(wù)執(zhí)行完畢后相隔delay時間執(zhí)行任務(wù)一次.
   */
  public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit);

}

WorkStealingPool

public static ExecutorService newWorkStealingPool(int parallelism) {
    return new ForkJoinPool(parallelism,ForkJoinPool.defaultForkJoinWorkerThreadFactory,null, true);
}

WorkStealingPool創(chuàng)建一個并行級別的線程池,同一時刻最多只能有指定個數(shù)個線程正在執(zhí)行任務(wù),創(chuàng)建時直接指定同一時刻最多能允許的并行執(zhí)行的線程個數(shù)即可,如果不傳則使用CPU的核數(shù)。

newWorkStealingPool方法內(nèi)部返回一個ForkJoinPool實例,F(xiàn)orkJoinPool是JAVA7新提供的線程池,同樣繼承AbstactExecutorService。

*作用類似于Semaphore。

以上所述是小編給大家介紹的Java中的線程池詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Oracle + Mybatis實現(xiàn)批量插入、更新和刪除示例代碼

    Oracle + Mybatis實現(xiàn)批量插入、更新和刪除示例代碼

    利用MyBatis動態(tài)SQL的特性,我們可以做一些批量的操作,下面這篇文章主要給大家介紹了關(guān)于Oracle + Mybatis實現(xiàn)批量插入、更新和刪除的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-01-01
  • SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper實例詳解

    SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper實例詳解

    這篇文章主要介紹了SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper實例詳解 ,需要的朋友可以參考下
    2017-09-09
  • Java多線程之多種鎖和阻塞隊列

    Java多線程之多種鎖和阻塞隊列

    今天帶大家學(xué)習(xí)的是Java多線程的相關(guān)知識,文章圍繞著java多種鎖和阻塞隊列展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • 深入理解Java三大特性中的多態(tài)

    深入理解Java三大特性中的多態(tài)

    多態(tài)性是對象多種表現(xiàn)形式的體現(xiàn)。在面向?qū)ο笾校畛R姷亩鄳B(tài)發(fā)生在使用父類的引用來引用子類的對象。下面這篇文章主要給大家深入的介紹了Java三大特性中多態(tài)的相關(guān)資料,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • JGroups實現(xiàn)聊天小程序

    JGroups實現(xiàn)聊天小程序

    這篇文章主要為大家詳細(xì)介紹了JGroups實現(xiàn)聊天小程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java中BIO、NIO、AIO的理解

    Java中BIO、NIO、AIO的理解

    這篇文章主要為大家詳細(xì)介紹了Java中BIO、NIO、AIO的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Spring實現(xiàn)一個簡單的SpringIOC容器

    Spring實現(xiàn)一個簡單的SpringIOC容器

    本篇文章主要介紹了Spring實現(xiàn)一個簡單的SpringIOC容器,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • 手把手教你搞懂冒泡排序和選擇排序

    手把手教你搞懂冒泡排序和選擇排序

    這篇文章主要介紹了java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • SpringBoot 如何使用 JWT 保護(hù) Rest Api 接口

    SpringBoot 如何使用 JWT 保護(hù) Rest Api&nbs

    使用spring-boot開發(fā)RESTful API非常的方便,在生產(chǎn)環(huán)境中,對發(fā)布的 API 增加授權(quán)保護(hù)是非常必要的,現(xiàn)在我們來看如何利用JWT技術(shù)為API 增加授權(quán)保護(hù),保證只有獲得授權(quán)的用戶才能夠訪問 API,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • springboot+mybaties項目中掃描不到@mapper注解的解決方法

    springboot+mybaties項目中掃描不到@mapper注解的解決方法

    本文主要介紹了springboot+mybaties項目中掃描不到@mapper注解的解決方法,該報錯表明掃描不到Mapper層,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05

最新評論