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

java ThreadPool線程池的使用,線程池工具類用法說明

 更新時間:2020年10月09日 10:02:46   作者:Gogym  
這篇文章主要介紹了java ThreadPool線程池的使用,線程池工具類用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

實際上java已經提供線程池的實現(xiàn) ExecutorService。

為了更方便的使用和管理。這里提供一個線程池工具類,方便大家的使用。

直接看看代碼:

使用

public static void main(String[] args)
  {
    //實例化一個固定數(shù)目的線程池。具體參考類的構造方法
    ThreadPool threadPool=new ThreadPool(ThreadPool.FixedThread,5);
    //線程池執(zhí)行線程
    threadPool.execute(new Runnable() {
      @Override
      public void run() {
 
      }
    });
  }

工具類:

package com.rbl.ncf.common.plugin.threadpool;
 
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
 
/**
 *線程池工具類
 */
public class ThreadPool {
 
  public static final int FixedThread = 0;
 
  public static final int CachedThread = 1;
 
  public static final int SingleThread = 2;
 
  @Retention(RetentionPolicy.SOURCE)
  public @interface Type {
  }
 
  private ExecutorService exec;
 
  private ScheduledExecutorService scheduleExec;
 
  private ThreadPool() {
    throw new UnsupportedOperationException("u can't instantiate me...");
  }
 
  /**
   * ThreadPoolUtils構造函數(shù)
   *
   * @param type     線程池類型
   * @param corePoolSize 只對Fixed和Scheduled線程池起效
   */
  public ThreadPool(final int type, final int corePoolSize) {
    // 構造有定時功能的線程池
    // ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE, 10L, TimeUnit.MILLISECONDS, new
    // BlockingQueue<Runnable>)
    scheduleExec = Executors.newScheduledThreadPool(corePoolSize);
    switch (type) {
      case FixedThread:
        // 構造一個固定線程數(shù)目的線程池
        // ThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new
        // LinkedBlockingQueue<Runnable>());
        exec = Executors.newFixedThreadPool(corePoolSize);
        break;
      case SingleThread:
        // 構造一個只支持一個線程的線程池,相當于newFixedThreadPool(1)
        // ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new
        // LinkedBlockingQueue<Runnable>())
        exec = Executors.newSingleThreadExecutor();
        break;
      case CachedThread:
        // 構造一個緩沖功能的線程池
        // ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new
        // SynchronousQueue<Runnable>());
        exec = Executors.newCachedThreadPool();
        break;
    }
  }
 
  /**
   * 在未來某個時間執(zhí)行給定的命令 <p>該命令可能在新的線程、已入池的線程或者正調用的線程中執(zhí)行,這由 Executor 實現(xiàn)決定。</p>
   *
   * @param command 命令
   */
  public void execute(final Runnable command) {
    exec.execute(command);
  }
 
  /**
   * 在未來某個時間執(zhí)行給定的命令鏈表 <p>該命令可能在新的線程、已入池的線程或者正調用的線程中執(zhí)行,這由 Executor 實現(xiàn)決定。</p>
   *
   * @param commands 命令鏈表
   */
  public void execute(final List<Runnable> commands) {
    for (Runnable command : commands) {
      exec.execute(command);
    }
  }
 
  /**
   * 待以前提交的任務執(zhí)行完畢后關閉線程池 <p>啟動一次順序關閉,執(zhí)行以前提交的任務,但不接受新任務。 如果已經關閉,則調用沒有作用。</p>
   */
  public void shutDown() {
    exec.shutdown();
  }
 
  /**
   * 試圖停止所有正在執(zhí)行的活動任務 <p>試圖停止所有正在執(zhí)行的活動任務,暫停處理正在等待的任務,并返回等待執(zhí)行的任務列表。</p>
   * <p>無法保證能夠停止正在處理的活動執(zhí)行任務,但是會盡力嘗試。</p>
   *
   * @return 等待執(zhí)行的任務的列表
   */
  public List<Runnable> shutDownNow() {
    return exec.shutdownNow();
  }
 
  /**
   * 判斷線程池是否已關閉
   *
   * @return {@code true}: 是<br>{@code false}: 否
   */
  public boolean isShutDown() {
    return exec.isShutdown();
  }
 
  /**
   * 關閉線程池后判斷所有任務是否都已完成 <p>注意,除非首先調用 shutdown 或 shutdownNow,否則 isTerminated 永不為 true。</p>
   *
   * @return {@code true}: 是<br>{@code false}: 否
   */
  public boolean isTerminated() {
    return exec.isTerminated();
  }
 
  /**
   * 請求關閉、發(fā)生超時或者當前線程中斷 <p>無論哪一個首先發(fā)生之后,都將導致阻塞,直到所有任務完成執(zhí)行。</p>
   *
   * @param timeout 最長等待時間
   * @param unit  時間單位
   * @return {@code true}: 請求成功<br>{@code false}: 請求超時
   * @throws InterruptedException 終端異常
   */
  public boolean awaitTermination(final long timeout, final TimeUnit unit)
      throws InterruptedException {
    return exec.awaitTermination(timeout, unit);
  }
 
  /**
   * 提交一個Callable任務用于執(zhí)行 <p>如果想立即阻塞任務的等待,則可以使用{@code result = exec.submit(aCallable).get();}
   * 形式的構造。</p>
   *
   * @param task 任務
   * @param <T> 泛型
   * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回該任務的結果。
   */
  public <T> Future<T> submit(final Callable<T> task) {
    return exec.submit(task);
  }
 
  /**
   * 提交一個Runnable任務用于執(zhí)行
   *
   * @param task  任務
   * @param result 返回的結果
   * @param <T>  泛型
   * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回該任務的結果。
   */
  public <T> Future<T> submit(final Runnable task, final T result) {
    return exec.submit(task, result);
  }
 
  /**
   * 提交一個Runnable任務用于執(zhí)行
   *
   * @param task 任務
   * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回null結果。
   */
  public Future<?> submit(final Runnable task) {
    return exec.submit(task);
  }
 
  /**
   * 執(zhí)行給定的任務 <p>當所有任務完成時,返回保持任務狀態(tài)和結果的Future列表。 返回列表的所有元素的{@link Future#isDone}為{@code true}。
   * 注意,可以正常地或通過拋出異常來終止已完成任務。 如果正在進行此操作時修改了給定的 collection,則此方法的結果是不確定的。</p>
   *
   * @param tasks 任務集合
   * @param <T>  泛型
   * @return 表示任務的 Future 列表,列表順序與給定任務列表的迭代器所生成的順序相同,每個任務都已完成。
   * @throws InterruptedException 如果等待時發(fā)生中斷,在這種情況下取消尚未完成的任務。
   */
  public <T> List<Future<T>> invokeAll(final Collection<? extends Callable<T>> tasks)
      throws InterruptedException {
    return exec.invokeAll(tasks);
  }
 
  /**
   * 執(zhí)行給定的任務 <p>當所有任務完成或超時期滿時(無論哪個首先發(fā)生),返回保持任務狀態(tài)和結果的Future列表。 返回列表的所有元素的{@link Future#isDone}為
   * {@code true}。 一旦返回后,即取消尚未完成的任務。 注意,可以正常地或通過拋出異常來終止已完成任務。 如果此操作正在進行時修改了給定的
   * collection,則此方法的結果是不確定的。</p>
   *
   * @param tasks  任務集合
   * @param timeout 最長等待時間
   * @param unit  時間單位
   * @param <T>   泛型
   * @return 表示任務的 Future 列表,列表順序與給定任務列表的迭代器所生成的順序相同。如果操作未超時,則已完成所有任務。如果確實超時了,則某些任務尚未完成。
   * @throws InterruptedException 如果等待時發(fā)生中斷,在這種情況下取消尚未完成的任務
   */
  public <T> List<Future<T>> invokeAll(final Collection<? extends Callable<T>> tasks,
                     final long timeout, final TimeUnit unit)
      throws InterruptedException {
    return exec.invokeAll(tasks, timeout, unit);
  }
 
  /**
   * 執(zhí)行給定的任務 <p>如果某個任務已成功完成(也就是未拋出異常),則返回其結果。 一旦正?;虍惓7祷睾?,則取消尚未完成的任務。
   * 如果此操作正在進行時修改了給定的collection,則此方法的結果是不確定的。</p>
   *
   * @param tasks 任務集合
   * @param <T>  泛型
   * @return 某個任務返回的結果
   * @throws InterruptedException 如果等待時發(fā)生中斷
   * @throws ExecutionException  如果沒有任務成功完成
   */
  public <T> T invokeAny(final Collection<? extends Callable<T>> tasks)
      throws InterruptedException, ExecutionException {
    return exec.invokeAny(tasks);
  }
 
  /**
   * 執(zhí)行給定的任務 <p>如果在給定的超時期滿前某個任務已成功完成(也就是未拋出異常),則返回其結果。 一旦正?;虍惓7祷睾?,則取消尚未完成的任務。
   * 如果此操作正在進行時修改了給定的collection,則此方法的結果是不確定的。</p>
   *
   * @param tasks  任務集合
   * @param timeout 最長等待時間
   * @param unit  時間單位
   * @param <T>   泛型
   * @return 某個任務返回的結果
   * @throws InterruptedException 如果等待時發(fā)生中斷
   * @throws ExecutionException  如果沒有任務成功完成
   * @throws TimeoutException   如果在所有任務成功完成之前給定的超時期滿
   */
  public <T> T invokeAny(final Collection<? extends Callable<T>> tasks, final long timeout,
              final TimeUnit unit)
      throws InterruptedException, ExecutionException, TimeoutException {
    return exec.invokeAny(tasks, timeout, unit);
  }
 
  /**
   * 延遲執(zhí)行Runnable命令
   *
   * @param command 命令
   * @param delay  延遲時間
   * @param unit  單位
   * @return 表示掛起任務完成的ScheduledFuture,并且其{@code get()}方法在完成后將返回{@code null}
   */
  public ScheduledFuture<?> schedule(final Runnable command, final long delay,
                    final TimeUnit unit) {
    return scheduleExec.schedule(command, delay, unit);
  }
 
  /**
   * 延遲執(zhí)行Callable命令
   *
   * @param callable 命令
   * @param delay  延遲時間
   * @param unit   時間單位
   * @param <V>   泛型
   * @return 可用于提取結果或取消的ScheduledFuture
   */
  public <V> ScheduledFuture<V> schedule(final Callable<V> callable, final long delay,
                      final TimeUnit unit) {
    return scheduleExec.schedule(callable, delay, unit);
  }
 
  /**
   * 延遲并循環(huán)執(zhí)行命令
   *
   * @param command   命令
   * @param initialDelay 首次執(zhí)行的延遲時間
   * @param period    連續(xù)執(zhí)行之間的周期
   * @param unit     時間單位
   * @return 表示掛起任務完成的ScheduledFuture,并且其{@code get()}方法在取消后將拋出異常
   */
  public ScheduledFuture<?> scheduleWithFixedRate(final Runnable command,
                          final long initialDelay, final long period,
                          final TimeUnit unit) {
    return scheduleExec.scheduleAtFixedRate(command, initialDelay, period, unit);
  }
 
  /**
   * 延遲并以固定休息時間循環(huán)執(zhí)行命令
   *
   * @param command   命令
   * @param initialDelay 首次執(zhí)行的延遲時間
   * @param delay    每一次執(zhí)行終止和下一次執(zhí)行開始之間的延遲
   * @param unit     時間單位
   * @return 表示掛起任務完成的ScheduledFuture,并且其{@code get()}方法在取消后將拋出異常
   */
  public ScheduledFuture<?> scheduleWithFixedDelay(final Runnable command,
                           final long initialDelay, final long delay,
                           final TimeUnit unit) {
    return scheduleExec.scheduleWithFixedDelay(command, initialDelay, delay, unit);
  } 
}

補充知識:Java線程池之ThreadPoolExecutor以及工具類Executors類

首先,介紹線程池的概念。

簡單講,就是有一個“池”內放著一些已經啟動的線程,這些線程一直啟動,用來執(zhí)行線程池接受的任務。這些線程我們稱為核心線程。

當接收任務過多時,會進入阻塞隊列進行存儲。

而如果阻塞隊列也滿,則會創(chuàng)建線程來執(zhí)行任務,這些任務稱為救急線程。救急線程任務結束后會根據(jù)存活時間來釋放

ThreadPoolExecutor的創(chuàng)建參數(shù)就是基于上述的概念:

ThreadPoolExecutor(int corePoolSize,//核心線程數(shù)目
          int maximumPoolSize,//最大線程數(shù) = 核心線程數(shù) + 救急線程數(shù)
          long keepAliveTime,//救急線程的存活超時時間
          TimeUnit unit,//超時時間的單位
          BlockingQueue<Runnable> workQueue,//阻塞隊列
          ThreadFactory threadFactory,//線程工廠,主要用于給線程起名,
          RejectedExecutionHandler handler)//拒絕策略,即隊列滿了后再接受任務怎么處理

會有多種構造方法,常用的是前5個參數(shù)的構造。本質上都是調用了這個構造方法

ThreadPoolExecutor類繼承自AbstractExecutorService類,而AbstractExecutorService類實現(xiàn)了ExecutorService接口。(因為后面工具類的返回值是ExecutorService接口對象,而不是ThreadPoolExecutor對象)。線程池操作都定義在ExecutorService接口中。

根據(jù)不同的需求,會產生不同的線程池。為了方便,有了Executors類來創(chuàng)建一些常用的線程池,注意的是返回值是ExecutorService對象

需求一:固定大小的線程池,即Executors.newFixedThreadPool(corePoolSize)。是只有一定數(shù)量的核心數(shù)量(參數(shù)),即核心數(shù)目等于總數(shù)目。阻塞隊列使用的是LinkedBlockingQueue<Runnable>。適應于任務數(shù)量已知,且相對耗時

本質是調用了

ThreadPoolExecutor(corePoolSize,coreSize,0,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>() )

需求二、帶緩沖區(qū)的線程隊列,即Executors.newCachedThreadPool()。沒有核心線程,全都是救急線程。超時時間設為60秒。阻塞隊列使用的是SynchronousQueue<Runnable>。 該隊列沒有容量,沒有線程取任務是不能夠放任務的。

本質調用:

ThreadPoolExecutor(0,Integer.MAx_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>() )

需求三:單線程線程池:即Executors.newSingleThreadPool() , 即需求一的特殊情況,只有一個核心線程。即:

ThreadPoolExecutor(1,1,0,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>() )

以上這篇java ThreadPool線程池的使用,線程池工具類用法說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot配置類中@Configuration和@Bean的作用

    SpringBoot配置類中@Configuration和@Bean的作用

    這篇文章主要介紹了SpringBoot配置類中@Configuration和@Bean的作用,@Configuration 指明當前類是一個配置類來替代之前的Spring配置文件,Spring boot的配置類,相當于Spring的配置文件,需要的朋友可以參考下
    2023-11-11
  • mybatis中的count()按條件查詢方式

    mybatis中的count()按條件查詢方式

    這篇文章主要介紹了mybatis中的count()按條件查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java理論基礎Stream?reduce實現(xiàn)集合元素歸約

    java理論基礎Stream?reduce實現(xiàn)集合元素歸約

    這篇文章主要為大家介紹了java理論基礎Stream?reduce實現(xiàn)集合元素歸約示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • 關于post請求內容無法重復獲取的解決方法

    關于post請求內容無法重復獲取的解決方法

    這篇文章主要介紹了關于post請求內容無法重復獲取的解決方法,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • Java數(shù)據(jù)結構之棧的線性結構詳解

    Java數(shù)據(jù)結構之棧的線性結構詳解

    從數(shù)據(jù)結構上看棧和隊列都是線性表,不過是兩種特殊的線性表,棧只允許在的一端進行插人或刪除操作,而隊列只允許在表的一端進行插人操作、而在另一端進行刪除操作,這篇文章主要給大家介紹了關于Java數(shù)據(jù)結構之棧的線性結構的相關資料,需要的朋友可以參考下
    2021-08-08
  • java銀行管理系統(tǒng)源碼

    java銀行管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了java銀行管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 關于Spring事務隔離、傳播屬性與@Transactional注解

    關于Spring事務隔離、傳播屬性與@Transactional注解

    這篇文章主要介紹了關于事務隔離、Spring傳播屬性與@Transactional注解,如果一組處理步驟或者全部發(fā)生或者一步也不執(zhí)行,我們稱該組處理步驟為一個事務,需要的朋友可以參考下
    2023-05-05
  • SpringMVC攔截器超詳細解讀

    SpringMVC攔截器超詳細解讀

    SpringMVC的處理器攔截器,類似于Servlet開發(fā)中的過濾器Filter,用于對處理器進行預處理和后處理。?依賴于web框架,在實現(xiàn)上基于Java的反射機制,屬于面向切面編程(AOP)的一種運用
    2022-07-07
  • Java實現(xiàn)俄羅斯方塊的源碼分享

    Java實現(xiàn)俄羅斯方塊的源碼分享

    俄羅斯方塊是一個最初由阿列克謝帕吉特諾夫在蘇聯(lián)設計和編程的益智類視頻游戲。本文將利用Java語言實現(xiàn)這一經典的小游戲,感興趣的可以學習一下
    2022-05-05
  • Java8新特性之線程安全日期類

    Java8新特性之線程安全日期類

    這篇文章主要介紹了Java8新特性之線程安全日期類,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04

最新評論