1. 程式人生 > >執行緒池相關工具類

執行緒池相關工具類

import android.support.annotation.IntDef;
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 final class ThreadPoolUtils {


    public static final int FixedThread  = 0;
    public static final int CachedThread = 1;
    public static final int SingleThread = 2;


    @IntDef({FixedThread, CachedThread, SingleThread})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Type {
    }


    private ExecutorService          exec;
    private ScheduledExecutorService scheduleExec;


    private ThreadPoolUtils() {
        throw new UnsupportedOperationException("u can't instantiate me...");
    }


    /**
     * ThreadPoolUtils建構函式
     *
     * @param type         執行緒池型別
     * @param corePoolSize 只對Fixed和Scheduled執行緒池起效
     */
    public ThreadPoolUtils(@Type int type, int corePoolSize) {
        // 構造有定時功能的執行緒池
        // ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE, 10L, TimeUnit.MILLISECONDS, new BlockingQueue<Runnable>)
        scheduleExec = Executors.newScheduledThreadPool(corePoolSize);
        switch (type) {
            case FixedThread:
                // 構造一個固定執行緒數目的執行緒池
                // 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;
        }
    }


    /**
     * 在未來某個時間執行給定的命令
     * <p>該命令可能在新的執行緒、已入池的執行緒或者正呼叫的執行緒中執行,這由 Executor 實現決定。</p>
     *
     * @param command 命令
     */
    public void execute(Runnable command) {
        exec.execute(command);
    }


    /**
     * 在未來某個時間執行給定的命令連結串列
     * <p>該命令可能在新的執行緒、已入池的執行緒或者正呼叫的執行緒中執行,這由 Executor 實現決定。</p>
     *
     * @param commands 命令連結串列
     */
    public void execute(List<Runnable> commands) {
        for (Runnable command : commands) {
            exec.execute(command);
        }
    }


    /**
     * 待以前提交的任務執行完畢後關閉執行緒池
     * <p>啟動一次順序關閉,執行以前提交的任務,但不接受新任務。
     * 如果已經關閉,則呼叫沒有作用。</p>
     */
    public void shutDown() {
        exec.shutdown();
    }


    /**
     * 試圖停止所有正在執行的活動任務
     * <p>試圖停止所有正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。</p>
     * <p>無法保證能夠停止正在處理的活動執行任務,但是會盡力嘗試。</p>
     *
     * @return 等待執行的任務的列表
     */
    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();
    }




    /**
     * 請求關閉、發生超時或者當前執行緒中斷
     * <p>無論哪一個首先發生之後,都將導致阻塞,直到所有任務完成執行。</p>
     *
     * @param timeout 最長等待時間
     * @param unit    時間單位
     * @return {@code true}: 請求成功<br>{@code false}: 請求超時
     * @throws InterruptedException 終端異常
     */
    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
        return exec.awaitTermination(timeout, unit);
    }


    /**
     * 提交一個Callable任務用於執行
     * <p>如果想立即阻塞任務的等待,則可以使用{@code result = exec.submit(aCallable).get();}形式的構造。</p>
     *
     * @param task 任務
     * @param <T>  泛型
     * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回該任務的結果。
     */
    public <T> Future<T> submit(Callable<T> task) {
        return exec.submit(task);
    }


    /**
     * 提交一個Runnable任務用於執行
     *
     * @param task   任務
     * @param result 返回的結果
     * @param <T>    泛型
     * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回該任務的結果。
     */
    public <T> Future<T> submit(Runnable task, T result) {
        return exec.submit(task, result);
    }


    /**
     * 提交一個Runnable任務用於執行
     *
     * @param task 任務
     * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回null結果。
     */
    public Future<?> submit(Runnable task) {
        return exec.submit(task);
    }


    /**
     * 執行給定的任務
     * <p>當所有任務完成時,返回保持任務狀態和結果的Future列表。
     * 返回列表的所有元素的{@link Future#isDone}為{@code true}。
     * 注意,可以正常地或通過丟擲異常來終止已完成任務。
     * 如果正在進行此操作時修改了給定的 collection,則此方法的結果是不確定的。</p>
     *
     * @param tasks 任務集合
     * @param <T>   泛型
     * @return 表示任務的 Future 列表,列表順序與給定任務列表的迭代器所生成的順序相同,每個任務都已完成。
     * @throws InterruptedException 如果等待時發生中斷,在這種情況下取消尚未完成的任務。
     */
    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {
        return exec.invokeAll(tasks);
    }


    /**
     * 執行給定的任務
     * <p>當所有任務完成或超時期滿時(無論哪個首先發生),返回保持任務狀態和結果的Future列表。
     * 返回列表的所有元素的{@link Future#isDone}為{@code true}。
     * 一旦返回後,即取消尚未完成的任務。
     * 注意,可以正常地或通過丟擲異常來終止已完成任務。
     * 如果此操作正在進行時修改了給定的 collection,則此方法的結果是不確定的。</p>
     *
     * @param tasks   任務集合
     * @param timeout 最長等待時間
     * @param unit    時間單位
     * @param <T>     泛型
     * @return 表示任務的 Future 列表,列表順序與給定任務列表的迭代器所生成的順序相同。如果操作未超時,則已完成所有任務。如果確實超時了,則某些任務尚未完成。
     * @throws InterruptedException 如果等待時發生中斷,在這種情況下取消尚未完成的任務
     */
    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws
            InterruptedException {
        return exec.invokeAll(tasks, timeout, unit);
    }


    /**
     * 執行給定的任務
     * <p>如果某個任務已成功完成(也就是未丟擲異常),則返回其結果。
     * 一旦正常或異常返回後,則取消尚未完成的任務。
     * 如果此操作正在進行時修改了給定的collection,則此方法的結果是不確定的。</p>
     *
     * @param tasks 任務集合
     * @param <T>   泛型
     * @return 某個任務返回的結果
     * @throws InterruptedException 如果等待時發生中斷
     * @throws ExecutionException   如果沒有任務成功完成
     */
    public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {
        return exec.invokeAny(tasks);
    }


    /**
     * 執行給定的任務
     * <p>如果在給定的超時期滿前某個任務已成功完成(也就是未丟擲異常),則返回其結果。
     * 一旦正常或異常返回後,則取消尚未完成的任務。
     * 如果此操作正在進行時修改了給定的collection,則此方法的結果是不確定的。</p>
     *
     * @param tasks   任務集合
     * @param timeout 最長等待時間
     * @param unit    時間單位
     * @param <T>     泛型
     * @return 某個任務返回的結果
     * @throws InterruptedException 如果等待時發生中斷
     * @throws ExecutionException   如果沒有任務成功完成
     * @throws TimeoutException     如果在所有任務成功完成之前給定的超時期滿
     */
    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws
            InterruptedException, ExecutionException, TimeoutException {
        return exec.invokeAny(tasks, timeout, unit);
    }


    /**
     * 延遲執行Runnable命令
     *
     * @param command 命令
     * @param delay   延遲時間
     * @param unit    單位
     * @return 表示掛起任務完成的ScheduledFuture,並且其{@code get()}方法在完成後將返回{@code null}
     */
    public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
        return scheduleExec.schedule(command, delay, unit);
    }


    /**
     * 延遲執行Callable命令
     *
     * @param callable 命令
     * @param delay    延遲時間
     * @param unit     時間單位
     * @param <V>      泛型
     * @return 可用於提取結果或取消的ScheduledFuture
     */
    public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
        return scheduleExec.schedule(callable, delay, unit);
    }


    /**
     * 延遲並迴圈執行命令
     *
     * @param command      命令
     * @param initialDelay 首次執行的延遲時間
     * @param period       連續執行之間的週期
     * @param unit         時間單位
     * @return 表示掛起任務完成的ScheduledFuture,並且其{@code get()}方法在取消後將丟擲異常
     */
    public ScheduledFuture<?> scheduleWithFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
        return scheduleExec.scheduleAtFixedRate(command, initialDelay, period, unit);
    }


    /**
     * 延遲並以固定休息時間迴圈執行命令
     *
     * @param command      命令
     * @param initialDelay 首次執行的延遲時間
     * @param delay        每一次執行終止和下一次執行開始之間的延遲
     * @param unit         時間單位
     * @return 表示掛起任務完成的ScheduledFuture,並且其{@code get()}方法在取消後將丟擲異常
     */
    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
        return scheduleExec.scheduleWithFixedDelay(command, initialDelay, delay, unit);
    }
}

相關推薦

執行相關工具

import android.support.annotation.IntDef; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java

JAVA百科---執行建立工具

一、前言 在《阿里巴巴Java開發手冊》中提到: 建立執行緒或執行緒池時請指定有意義的執行緒名稱,方便出錯時回溯。 執行緒資源必須通過執行緒池提供,不允許在應用中自行顯式建立執行緒。 執行緒池不允許使用 Executors 去建立,而是通過 ThreadPoolExe

執行原理--工廠Executors

文章目錄 執行緒池原理--工廠類Executors 構造器 newFixedThreadPool newSingleThreadExecutor newCachedThreadPool newScheduledThre

Java中的執行及其實現ThreadPoolExecutor

前言:像我們連線資料庫一樣,需要不斷地建立連線,銷燬連線,如果都是人為地一個個建立和銷燬的話會很費勁,所以就誕生了資料庫連線池,執行緒池的產生也是同樣的道理。 執行緒池預先建立了若干數量的執行緒,並且不能由使用者直接對執行緒的建立進行控制,在這個前提下重複使用固定或較為固定數目的執行緒來完成任務

執行 技術點 目錄 1. 執行作用: 提升效能 1 2. 使用流程 1 3. 執行執行的監控 jvisual 1 4. 執行常用方法 2 5. 執行相關概念 2 5.1. 佇列

 池與執行緒池 技術點   目錄 1. 執行緒池作用:  提升效能 1 2. 使用流程 1 3. 執行緒與執行緒池的監控  jvisual 1 4. 執行緒常用方法 2 5. 執行緒池相關概念 2 5.1. 佇列 &n

記5.28大促壓測的效能優化—執行相關問題

目錄: 1.環境介紹 2.症狀 3.診斷 4.結論 5.解決 6.對比java實現 廢話就不多說了,本文分享下博主在5.28大促壓測期間解決的一個性能問題,覺得這個還是比較有意思的,值得總結拿出來分享下。 博主所服務的部門是作為公共業務平臺,公共業務平臺支援上層所有業務系統(2C、UGC、直播

Java多執行之併發工具

一、總論:在JDK中提供了幾種併發工具類 1)CountDownLatch(同步倒數計數器:等待多執行緒(或者多步驟)完成) 2)CyclicBarrier(迴圈屏障:同步屏障) 3)Semaphore(訊號量:控制併發程序數) 主要參考資料

Java多執行三:執行和Executors解析

執行緒池 多執行緒技術主要解決處理器單元內多個執行緒執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。 假設一個伺服器完成一項任務所需時間為:T1 建立執行緒時間,T2 線上程中執行任務的時間,T3 銷燬執行緒時間。 如果:T1 +

Windows下檢視程序與執行相關工具

pslist是用命令列檢視程序/執行緒;ProcessExplorer是圖形化的檢視程序/執行緒。 ======================================================================================================

Android ThreadPoolUtils-執行相關

ThreadPoolUtils是一個執行緒池相關 package com.blankj.utilcode.utils; import java.util.Collection; import java.util.List; import java.util.concur

java高併發系列 - 第16天:JUC中等待多執行完成的工具CountDownLatch,必備技能

這是java高併發系列第16篇文章。 本篇內容 介紹CountDownLatch及使用場景 提供幾個示例介紹CountDownLatch的使用 手寫一個並行處理任務的工具類 假如有這樣一個需求,當我們需要解析一個Excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析一個sheet裡的資料

JUC——執行同步輔助工具(Semaphore,CountDownLatch,CyclicBarrier)

CountDownLatch CountDownLatch是一個計數器閉鎖,通過它可以完成類似於阻塞當前執行緒的功能,即:一個執行緒或多個執行緒一直等待,直到其他執行緒執行的操作完成。CountDownLatch用一個給定的計數器來初始化,該計數器的操作是原子操作,即同時只能有一個執行緒去操作該計數器。呼叫該

執行工具封裝

一、 為什麼要使用執行緒池: 1.頻繁建立和銷燬執行緒耗資源,耗時間,換句話說,執行緒池就能節約資源,節約時間。 2.有的執行緒執行任務的時間甚至比建立和銷燬執行緒的時間還短。 二 、執行緒池的作用: 執行緒池是預先建立執行緒的一種技術。執行緒池在還沒有任務到來之前,建立一定數量的執行緒,加

執行執行相關

執行緒池概述 系統啟用一個新執行緒的成本是比較高的,因為它涉及與作業系統互動。在這種情形下,使用執行緒池可以很好的提高效能。執行緒池在系統啟動時即建立大量空閒的執行緒,程式將一個Runnable物件或Callable物件傳給執行緒池,執行緒池會啟動一個執行緒來執行它們的run()或call方

執行工具,直接可用!

import android.support.annotation.IntDef; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; im

利用執行實現Android客戶端的http網路資料請求工具

該工具類值只實現了HTTP的get方法,參考get方法可輕鬆實現post、put、delete等方法,下面是get方法的實現 public class SimpleHttpClient { private static final String TAG = Sim

Executors工具 4種獲取執行服務物件的方法

java中目前我只瞭解4 種獲得多執行緒的方法 : 1.繼承Thread類 ,重寫run方法 2.new Thread(實現Runnable介面) 3.FutureTask ft = new FutureTask<Integer>(new MyThread())

java 執行 ExecutorService相關歸納

public class ExecutorServiceDemo {     public static void main(String[] args) {          // 單執行緒池  &

Java多執行 - 執行 ThreadPoolExecutor的使用

ThreadPoolExecutor類可以非常方便的建立執行緒池物件,而不需要程式設計師設計大量的new去例項化Thread相關的程式碼 最常用的構造方法 (不過threadFactory可以視情況設或不設) ThreadPoolExecutor(   &nb

執行原理–拒絕策略之RejectedExecutionHandler

文章目錄 執行緒池原理–拒絕策略之RejectedExecutionHandler類 RejectedExecutionHandler 介面 CallerRunsPolicy AbortPolicy Disca