91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Executor的原理是什么

發布時間:2021-06-18 17:18:23 來源:億速云 閱讀:282 作者:Leah 欄目:大數據

這篇文章給大家介紹Executor的原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、Executor 線程池體系介紹

1. Executor 框架體系介紹

Executor的原理是什么

  • Executor: java線程池框架的最上層父接口,在Executor中只有executor()方法,該方法表示提交Runnable類型線程池并執行。

  • ExecutorService: Executor的子接口,該接口中submit()方法可接收Runnable參數或Callable參數,在使用結束后使用shutdown()方法關閉線程池,不再接收新的任務。

  • AbstractExecutorService: ExecutorService的默認實現類。

  • ScheduledExecutorService: ExecutorService的子接口,可供定時任務調度的接口。

  • ScheduledThreadPoolExecutor: 提供了另一種線程池,延遲執行和周期性執行的線程池。

  • ThreadPoolExecutor: Java線程池最核心的一個類,該類繼承自AbstractExecutorService主要功能是創建線程池,給任務分配線程資源,執行任務。

2. ThreadPoolExecutor 源碼解析

ThreadPoolExecutor有多個重載的構造方法,我們基于最完整的構造方法來分析每個參數的作用。

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.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

二、Executors 線程池工具類

1. newFixedThreadPool: 固定大小線程池

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>(),
                                      threadFactory);
    }
  • corePoolSize與maximumPoolSize相等,即其線程全為核心線程,是一個固定大小的線程池,是其優勢;

  • keepAliveTime = 0 該參數默認對核心線程無效,而FixedThreadPool全部為核心線程;

  • workQueue 為LinkedBlockingQueue(無界阻塞隊列),隊列最大值為Integer.MAX_VALUE。如果任務提交速度持續大余任務處理速度,會造成隊列大量阻塞。因為隊列很大,很有可能在拒絕策略前,內存溢出。是其劣勢;

  • FixedThreadPool的任務執行是無序的;

2. newSingleThreadExecutor: 單線程化線程池

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>(),
                                    threadFactory));
    }
  • 控制線程池中corePoolSize與maximumPoolSize都為1

  • FinalizableDelegatedExecutorService繼承DelegatedExecutorService,DelegatedExecutorService最終繼承AbstractExecutorService,該類是線程池的一個代理模式的實現,相比于ThreadPoolExecutor閹割一部分功能,形成線程池單例化。

3. newCachedThreadPool: 可緩存線程池

public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>(),
                                      threadFactory);
    }
  • corePoolSize = 0,maximumPoolSize = Integer.MAX_VALUE,即線程數量幾乎無限制

  • keepAliveTime = 60s,60s后空閑線程自動結束

  • SynchronousQueue 為同步隊列,入隊出隊必須同時傳遞,因為CachedThreadPool線程創建無限制,不會有隊列等待

4. newScheduledThreadPool: 周期性線程池

public static ScheduledExecutorService newScheduledThreadPool(
            int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
    }
  • newScheduledThreadPool為定長線程池,限定核心線程數

  • ScheduledThreadPoolExecutor方法中對線程池參數做了進一步的封裝,設置maximumPoolSize = Integer.MAX_VALUE,keepAliveTime = 0

  • 調用scheduleAtFixedRate()方法可進行周期性任務設置

5. newWorkStealingPool: 工作竊取線程池(jdk1.8)

public static ExecutorService newWorkStealingPool(int parallelism) {
        return new ForkJoinPool
            (parallelism,
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }
  • ForkJoinPool繼承AbstractExecutorService,ForkJoinPool可以充分利用多核cpu的優勢,將一個任務拆分成多個“小任務”并行計算,提高任務的執行時間

關于Executor的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五大连池市| 华亭县| 湖北省| 太和县| 石阡县| 五家渠市| 天水市| 长岛县| 吉水县| 阿荣旗| 乌拉特中旗| 阿勒泰市| 新蔡县| 正定县| 中方县| 连南| 淅川县| 合水县| 青田县| 咸宁市| 黄梅县| 博兴县| 驻马店市| 黔西县| 奎屯市| 同仁县| 余庆县| 乐至县| 武穴市| 宣城市| 应用必备| 托克托县| 林西县| 白水县| 鹿邑县| 双城市| 孟村| 保靖县| 高尔夫| 焦作市| 曲周县|