ThreadPoolExecutor詳細使用

值得注意的是儘量不要用,這種默認形式創建 線程池,結合自己的業務場景去做。Executors.newFixedThreadPool()
比如默認的創建 隊列會讓默認這種  無界限LinkedBlockingQueue隊列,可以自動擴容,但是遇到高併發的場景,擴容是非常慢的。非常
浪費時間,


import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;


   

    public static void main(String[] args) throws InterruptedException {
        /**
         *    public ThreadPoolExecutor(int corePoolSize,
         *                               int maximumPoolSize,
         *                               long keepAliveTime,
         *                               TimeUnit unit,
         *                               BlockingQueue<Runnable> workQueue,
         *                               ThreadFactory threadFactory,
         *                               RejectExecutionHandler handler
         *                               ) {
         *         this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         *              threadFactory, handler);
         *
         *         corePoolSize:表示線程池最小線程數量,舉個例子,老闆花錢僱你閒,活少的時候,
         *         不能把人都清走,要留點最少的人。
         *         maximumPoolSize:線程池最大的線程數量,當活很多的時候,最多加到maximumPoolSize人就不加了。
         *         keepAliveTime:如何判斷活的忙還是閒着,某個線程在那裏一段時間的空閒度,比如一個線程空閒了
         *         keepAliveTime秒 就表示閒了,且線程數大於corePoolSize 才生效,回收線程。
         *         unit:時間單位的設置
         *         workQueue:選擇不同的隊列,這個簡單具體查一下就可以:建議高併發下指定有界限的ArrayBlockingQueue
         *         因爲高併發下擴容非常耗時。
         *         threadFactory:自定義線程名稱
         *         handler:自定義拒絕策略,如果線程池中所有的線程都在忙碌,且隊列也滿了,就會執行拒絕策略
         *         有四種可以選擇:CallerRunsPolicy :提交任務的線程自己去執行該任務
         *                        AbortPolicy:默認的拒絕策略,會 throws RejectExecutionException.
         *                        DiscardPolicy:直接丟棄任務,沒有任何異常拋出。
         *                        DiscardOldestPolicy:丟棄最老的任務,其實就是把最早進入工作隊列的任務丟棄,然後
         *                        把新任務加入到工作隊列。
         *
         *
         *
         */


        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
                5,
                6,
                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(8)
                , new JxdThreadFactory("定義你自己的線程池"),
                new ThreadPoolExecutor.AbortPolicy()
        );
        Thread thread = new Thread(() -> {
            System.out.println("執行任務》》》" + Thread.currentThread().getName());
        });
        threadPoolExecutor.execute(thread);
    }


    /**
     * 定義內部類的方式,定義線程名稱
     */
    private static class JxdThreadFactory implements ThreadFactory {
        private static final AtomicInteger poolNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        public JxdThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                    Thread.currentThread().getThreadGroup();
            namePrefix = "pool-" +
                    poolNumber.getAndIncrement() +
                    "-thread-";
        }

        public JxdThreadFactory(String ThreadFactoryName) {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                    Thread.currentThread().getThreadGroup();
            namePrefix = ThreadFactoryName + "-" +
                    poolNumber.getAndIncrement() +
                    "-thread-";
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r,
                    namePrefix + threadNumber.getAndIncrement(),
                    0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }



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