免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

Executor的原理是什么

這篇文章給大家介紹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的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

分享標題:Executor的原理是什么
瀏覽地址:http://m.newbst.com/article0/jedgio.html

成都網站建設公司_創新互聯,為您提供網站策劃網站內鏈網站營銷ChatGPT商城網站靜態網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站建設