1. 程式人生 > 其它 >執行緒池處理Runnable任務

執行緒池處理Runnable任務

執行緒池如何處理Runnable任務

使用ExecutorService的方法:
void execute(Runnable target)

package com.itheima.d8_threadpool;

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + "輸出了:HelloWorld ==> "  + i);
        }
        try {
            System.out.println(Thread.currentThread().getName() + "本任務與執行緒綁定了,執行緒進入休眠了~~~");
            Thread.sleep(10000000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.itheima.d8_threadpool;

import java.util.concurrent.*;

/**
    目標:自定義一個執行緒池物件,並測試其特性。
 */
public class ThreadPoolDemo1 {
    public static void main(String[] args) {
        // 1、建立執行緒池物件
        /**
         public ThreadPoolExecutor(int corePoolSize,
                                 int maximumPoolSize,
                                 long keepAliveTime,
                                 TimeUnit unit,
                                 BlockingQueue<Runnable> workQueue,
                                 ThreadFactory threadFactory,
                                 RejectedExecutionHandler handler)
         */
        ExecutorService pool = new ThreadPoolExecutor(
                3,
                5 ,
                6,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(5) ,
                Executors.defaultThreadFactory(),
               new ThreadPoolExecutor.AbortPolicy()
        );

        // 2、給任務執行緒池處理。
        Runnable target = new MyRunnable();
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);

        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);

        // 建立臨時執行緒
        pool.execute(target);
        pool.execute(target);
//        // 不建立,拒絕策略被觸發!!!
//        pool.execute(target);

        // 關閉執行緒池(開發中一般不會使用)。
        // pool.shutdownNow(); // 立即關閉,即使任務沒有完成,會丟失任務的!
        pool.shutdown(); // 會等待全部任務執行完畢之後再關閉(建議使用的)
    }
}

 一共最大5個執行緒   當有3個執行緒 pool.execute(target); 執行的業務程式碼的時候。執行緒數量是3

 此時再新增5個執行緒 pool.execute(target); 執行的業務程式碼的時候 因為還沒有達到最大佇列數5 所以此時執行緒數量仍然是3

 此時再新增1個執行緒 開始 建立臨時執行緒。 因為臨時執行緒數量最大為2 

 當臨時執行緒超過2的時候 開始拒絕策略