JAVA多線程之線程池的使用

public class TestThreadPool {

    public static void main(String[] args) throws ExecutionException {
        //所使用阻塞隊列

        //直接提交策策略,工作隊列不保存任何任務被等待執行,而是直接提交給線程進行執行。newCachedThreadPool所使用阻塞隊列
        //使用此阻塞隊列時num不能大於maximumPoolSize,否則將報錯(因爲直接執行)
        //並且一次性執行num個線程
        BlockingQueue<Runnable> queue = new SynchronousQueue<>();

        //無界隊列策略,工作隊列大小沒有上限,可以添加無數個任務進行等待。newFixedThreadPool使用阻塞隊列
        //使用此阻塞隊列時num能大於maximumPoolSize(因爲無界,實際上就是maximumPoolSize已經無效了)
        //並且一次性執行corePoolSize個線程
        BlockingQueue<Runnable> queue2 = new LinkedBlockingQueue<>();

        //有界隊列策略,工作隊列大小有上限(防止工作隊列被無休止的添加)
        //這個隊列會保持隊列中有capacity個線程在等待,其餘線程執行
        BlockingQueue<Runnable> queue3 = new ArrayBlockingQueue<>(3); //capacity = 3

        //丟棄任務並拋出RejectedExecutionException異常
        //ThreadPoolExecutor.AbortPolicy

        //丟棄任務,但是不拋出異常
        //ThreadPoolExecutor.DiscardPolicy

        //丟棄隊列最前面的任務,然後重新提交被拒絕的任務
        //ThreadPoolExecutor.DiscardOldestPolicy

        //由調用線程(提交任務的線程)處理該任務
        //ThreadPoolExecutor.CallerRunsPolicy

        //核心線程數量
        int corePoolSize = 2;
        //最大線程池大小
        int maximumPoolSize = 10;
        //創建線程數量
        int num = 10;
        ExecutorService pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
                60, TimeUnit.SECONDS, queue3);

        for (int i = 0; i < num; i++) {
            pool.execute(()->{
                try {
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName()+"執行了一次run()");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        pool.shutdown();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章