ThreadPoolExecutor的參數理解

jopen 9年前發布 | 17K 次閱讀 Java開發 ThreadPoolExecutor

一、使用Executors創建線程池    

        之前創建線程的時候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()這三個方法。

    1. newFixedThreadPool()

    創建線程數固定大小的線程池。

   2.newSingleThreadPool()

    創建線程數為1的線程池,

    3.newCachedThreadPool()

    創建可緩沖的線程池。沒有大小限制


二、使用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.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

參數:

        1、corePoolSize核心線程數大小,當線程數<corePoolSize ,會創建線程執行runnable

        2、maximumPoolSize 最大線程數, 當線程數 >= corePoolSize的時候,會把runnable放入workQueue中

        3、keepAliveTime  保持存活時間,當線程數大于corePoolSize的空閑線程能保持的最大時間。

        4、unit 時間單位

        5、workQueue 保存任務的阻塞隊列

        6、threadFactory 創建線程的工廠

        7、handler 拒絕策略

任務執行順序:

        1、當線程數小于corePoolSize時,創建線程執行任務。

        2、當線程數大于等于corePoolSize并且workQueue沒有滿時,放入workQueue中

        3、線程數大于等于corePoolSize并且當workQueue滿時,新任務新建線程運行,線程總數要小于maximumPoolSize

        4、當線程總數等于maximumPoolSize并且workQueue滿了的時候執行handler的rejectedExecution。也就是拒絕策略。

ThreadPoolExecutor默認有四個拒絕策略:

        1、ThreadPoolExecutor.AbortPolicy()   直接拋出異常RejectedExecutionException

        2、ThreadPoolExecutor.CallerRunsPolicy()    直接調用run方法并且阻塞執行

        3、ThreadPoolExecutor.DiscardPolicy()   直接丟棄后來的任務

        4、ThreadPoolExecutor.DiscardOldestPolicy()  丟棄在隊列中隊首的任務

當然可以自己繼承RejectedExecutionHandler來寫拒絕策略.

      int corePoolSize = 1;
        int maximumPoolSize = 2;
        int keepAliveTime = 10;
//      BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(5);
        ThreadFactory threadFactory = Executors.defaultThreadFactory();
        //線程池和隊列滿了之后的處理方式
        //1.跑出異常
        RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); 
        RejectedExecutionHandler handler2 = new ThreadPoolExecutor.CallerRunsPolicy();
        RejectedExecutionHandler handler3 = new ThreadPoolExecutor.DiscardPolicy();
        RejectedExecutionHandler handler4 = new ThreadPoolExecutor.DiscardOldestPolicy();

    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, threadFactory, handler2);


    for (int j = 1; j < 15; j++) {
        threadPoolExecutor.execute(new Runnable() {

            public void run() {

                try {
                    System.out.println(Thread.currentThread().getName());
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }
        });
    }

    System.out.println(threadPoolExecutor);

}</pre> <p><br />

</p> 來自:http://my.oschina.net/u/2250599/blog/498787

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!