美文网首页
Java多线程13 自定义线程池

Java多线程13 自定义线程池

作者: 香沙小熊 | 来源:发表于2019-01-10 17:20 被阅读71次

    Java多线程目录
    1.任务队列
    2.拒绝策略(抛出异常、直接丢弃、阻塞、临时队列)
    3.init( min )
    4.active
    5.max

    min<=active<=max

    package chapter13;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    public class SimpleThreadPool {
    
        public final static DiscardPolicy DEFAULT_DISCARD_POLICY = () -> {
            throw new DiscardException("Discard This Task.");
        };
        private final static int DEFAULT_SIZE = 10;
        //设置线程任务最大值
        private final static int DEFAULT_TASK_QUEUE_SIZE = 2000;
        private final static LinkedList<Runnable> TASK_QUEUE = new LinkedList<>();
        private final static String THREAD_PREFIX = "SIMPLE_THREAD_POOL-";
        private final static ThreadGroup GROUP = new ThreadGroup("Pool_Group");
        private final static List<WorkerTask> THREAD_QUEUE = new ArrayList<>();
        private static volatile int seq = 0;
        private final int size;
        //队列大小
        private final int queueSize;
        private final DiscardPolicy discardPolicy;
    
        private volatile boolean destroy = false;
    
        public SimpleThreadPool() {
            this(DEFAULT_SIZE, DEFAULT_TASK_QUEUE_SIZE, DEFAULT_DISCARD_POLICY);
        }
    
        public SimpleThreadPool(int size, int queueSize, DiscardPolicy discardPolicy) {
            this.size = size;
            this.queueSize = queueSize;
            this.discardPolicy = discardPolicy;
            init();
        }
    
    
    
        private void init() {
    
            for (int i = 0; i < size; i++) {
                createWorkTask();
            }
        }
    
        public void submit(Runnable runnable) {
            if(destroy) throw new IllegalStateException("The thread pool already destroy and not allow submit task.");
            synchronized (TASK_QUEUE) {
                if (TASK_QUEUE.size() > queueSize) discardPolicy.discard();
                TASK_QUEUE.addLast(runnable);
                TASK_QUEUE.notifyAll();
            }
        }
    
        private void createWorkTask() {
            WorkerTask task = new WorkerTask(GROUP, THREAD_PREFIX + (seq++));
            task.start();
            THREAD_QUEUE.add(task);
        }
    
        public void shutdown() throws InterruptedException {
            while (!TASK_QUEUE.isEmpty()) {
                Thread.sleep(50);
            }
    
            int initVal = THREAD_QUEUE.size();
            while (initVal > 0) {
                for (WorkerTask task : THREAD_QUEUE) {
                    if (task.getTaskState() == TaskState.BLOCKED) {
                        task.interrupt();
                        task.close();
                        initVal--;
                    } else {
                        Thread.sleep(10);
                    }
                }
            }
            this.destroy = true;
            System.out.println("The thread pool disposed.");
        }
    
        public int getSize() {
            return size;
        }
    
        public int getQueueSize() {
            return queueSize;
        }
    
        public boolean destory() {
            return this.destroy;
        }
    
        private enum TaskState {
            FREE, RUNNING, BLOCKED, DEAD
        }
    
        public interface DiscardPolicy {
    
            void discard() throws DiscardException;
        }
    
        public static class DiscardException extends RuntimeException {
    
            public DiscardException(String message) {
                super(message);
            }
        }
    
        private static class WorkerTask extends Thread {
    
            private volatile TaskState taskState = TaskState.FREE;
    
            public WorkerTask(ThreadGroup group, String name) {
                super(group, name);
            }
    
            public TaskState getTaskState() {
                return this.taskState;
            }
    
            public void run() {
                OUTER:
                while (this.taskState != TaskState.DEAD) {
    
                    Runnable runnable;
                    synchronized (TASK_QUEUE) {
                        while (TASK_QUEUE.isEmpty()) {
                            try {
                                taskState = TaskState.BLOCKED;
                                TASK_QUEUE.wait();
                            } catch (InterruptedException e) {
                                break OUTER;
                            }
                        }
    
                        runnable = TASK_QUEUE.removeFirst();
                    }
    
                    if (runnable != null) {
                        taskState = TaskState.RUNNING;
                        runnable.run();
                        taskState = TaskState.FREE;
                    }
                }
            }
    
            public void close() {
                this.taskState = TaskState.DEAD;
            }
        }
    
    
    
        public static void main(String[] args) throws InterruptedException {
            SimpleThreadPool threadPool = new SimpleThreadPool();
            for (int i = 0; i < 40; i++) {
    
                int finalI = i;
                threadPool.submit(() -> {
                    System.out.println("The runnable " + finalI + " be serviced by " + Thread.currentThread() + " start.");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("The runnable " + finalI + " be serviced by " + Thread.currentThread() + " finished.");
                });
    
                System.out.println("======================");
    
            }
            Thread.sleep(4000);
            threadPool.shutdown();
            threadPool.submit(()->System.out.println("============="));
        }
    
    
    }
    
    ======================
    ======================
    The runnable 0 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] start.
    ======================
    The runnable 2 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 1 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] start.
    The runnable 3 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] start.
    ======================
    ======================
    ======================
    The runnable 5 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 6 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] start.
    ======================
    ======================
    The runnable 7 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 4 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 8 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] start.
    ======================
    ======================
    ======================
    ======================
    The runnable 9 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] start.
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    ======================
    The runnable 7 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 10 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 6 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] finished.
    The runnable 11 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] start.
    The runnable 3 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] finished.
    The runnable 12 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] start.
    The runnable 5 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 0 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] finished.
    The runnable 14 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] start.
    The runnable 2 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    The runnable 15 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 8 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] finished.
    The runnable 16 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] start.
    The runnable 4 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The runnable 17 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 9 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] finished.
    The runnable 1 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] finished.
    The runnable 19 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] start.
    The runnable 18 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] start.
    The runnable 13 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 10 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 14 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] finished.
    The runnable 11 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] finished.
    The runnable 22 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] start.
    The runnable 12 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] finished.
    The runnable 21 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] start.
    The runnable 20 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 23 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] start.
    The runnable 15 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    The runnable 24 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 17 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The runnable 18 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] finished.
    The runnable 25 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 13 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 16 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] finished.
    The runnable 19 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] finished.
    The runnable 28 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] start.
    The runnable 27 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 26 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] start.
    The runnable 29 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] start.
    The runnable 22 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] finished.
    The runnable 30 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] start.
    The runnable 20 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 31 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 23 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] finished.
    The runnable 21 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] finished.
    The runnable 32 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] start.
    The runnable 33 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] start.
    The runnable 24 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    The runnable 34 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 25 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The runnable 29 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] finished.
    The runnable 27 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 35 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 26 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] finished.
    The runnable 28 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] finished.
    The runnable 39 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] start.
    The runnable 38 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] start.
    The runnable 37 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 36 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] start.
    The runnable 33 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] finished.
    The runnable 32 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] finished.
    The runnable 31 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 30 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] finished.
    The runnable 39 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] finished.
    The runnable 34 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    The runnable 38 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] finished.
    The runnable 36 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] finished.
    The runnable 37 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 35 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The thread pool disposed.
    Exception in thread "main" java.lang.IllegalStateException: The thread pool already destroy and not allow submit task.
        at chapter13.SimpleThreadPool.submit(SimpleThreadPool.java:48)
        at chapter13.SimpleThreadPool.main(SimpleThreadPool.java:176)
    

    线程池本身就是一个线程

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;
    
    public class SimpleThreadPool extends Thread {
    
        public final static DiscardPolicy DEFAULT_DISCARD_POLICY = () -> {
            throw new DiscardException("Discard This Task.");
        };
        //设置线程任务最大值
        private final static int DEFAULT_TASK_QUEUE_SIZE = 2000;
        /**
         * 任务队列
         */
        private final static LinkedList<Runnable> TASK_QUEUE = new LinkedList<>();
        private final static String THREAD_PREFIX = "SIMPLE_THREAD_POOL-";
        /**
         * 线程组
         */
        private final static ThreadGroup GROUP = new ThreadGroup("Pool_Group");
        private final static List<WorkerTask> THREAD_QUEUE = new ArrayList<>();
        private static volatile int seq = 0;
        //队列大小
        private final int queueSize;
        private final DiscardPolicy discardPolicy;
        private int size;
        private volatile boolean destroy = false;
    
        /**
         * 最小线程数
         */
        private int min;
        /**
         * 最大线程数
         */
        private int max;
        /**
         * 线程活跃数
         */
        private int active;
    
        public SimpleThreadPool() {
            this(4, 8, 12, DEFAULT_TASK_QUEUE_SIZE, DEFAULT_DISCARD_POLICY);
        }
    
        public SimpleThreadPool(int min, int active, int max, int queueSize, DiscardPolicy discardPolicy) {
            this.min = min;
            this.active = active;
            this.max = max;
            this.queueSize = queueSize;
            this.discardPolicy = discardPolicy;
            init();
        }
    
        private void init() {
    
            for (int i = 0; i < this.min; i++) {
                createWorkTask();
            }
            /**
             * 默认线程大小为最小线程数
             */
            this.size = min;
            this.start();
        }
    
        public void submit(Runnable runnable) {
            if (destroy) throw new IllegalStateException("The thread pool already destroy and not allow submit task.");
            synchronized (TASK_QUEUE) {
                if (TASK_QUEUE.size() > queueSize) discardPolicy.discard();
                TASK_QUEUE.addLast(runnable);
                TASK_QUEUE.notifyAll();
            }
        }
    
        private void createWorkTask() {
            WorkerTask task = new WorkerTask(GROUP, THREAD_PREFIX + (seq++));
            task.start();
            THREAD_QUEUE.add(task);
        }
    
    
        public void shutdown() throws InterruptedException {
    
            while (!TASK_QUEUE.isEmpty()) {
                Thread.sleep(50);
            }
            //加锁 对线程进行操作唯一
            synchronized (THREAD_QUEUE) {
                int initVal = THREAD_QUEUE.size();
                while (initVal > 0) {
                    for (WorkerTask task : THREAD_QUEUE) {
                        if (task.getTaskState() == TaskState.BLOCKED) {
                            task.interrupt();
                            task.close();
                            initVal--;
                        } else {
                            Thread.sleep(10);
                        }
                    }
                }
    
            }
            this.destroy = true;
            System.out.println("The thread pool disposed.");
        }
    
        public int getSize() {
            return size;
        }
    
        public int getQueueSize() {
            return queueSize;
        }
    
        public boolean isDestory() {
            return this.destroy;
        }
    
        public int getMin() {
            return min;
        }
    
        public int getMax() {
            return max;
        }
    
        public int getActive() {
            return active;
        }
    
        @Override
        public void run() {
            while (!destroy) {
                System.out.printf("Pool#Min:%d,Active:%d,Max:%d,Current:%d,QueueSize:%d\n",
                        this.min, this.active, this.max, this.size, TASK_QUEUE.size());
    
    
                try {
                    Thread.sleep(5_000L);
                    //让线程池以最大活跃数运行
                    if (TASK_QUEUE.size() > active && size < active) {
                        for (int i = size; i < active; i++) {
                            createWorkTask();
                        }
                        System.out.println("The pool incremented to active.");
    
                        size = active;
                        //让线程池以最大线程数运行
                    } else if (TASK_QUEUE.size() > max && size < max) {
                        for (int i = size; i < max; i++) {
                            createWorkTask();
                        }
                        System.out.println("The pool incremented to max.");
                        //让size以最大活跃数运行
                        size = max;
                    }
    
    
                    /**
                     * 释放线程
                     * 加锁 防止submit的时候 有其他的操作
                     */
                    synchronized (TASK_QUEUE) {
                        if (TASK_QUEUE.isEmpty() && size > active) {
                            System.out.println("==========Reduce=========");
                            int releaseSize = size - active;
                            for (Iterator<WorkerTask> it = THREAD_QUEUE.iterator(); it.hasNext(); ) {
                                if (releaseSize <= 0) {
                                    break;
                                }
                                WorkerTask task = it.next();
                                task.close();
                                task.interrupt();
                                it.remove();
                                releaseSize--;
                            }
    
                            size = active;
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        private enum TaskState {
            FREE, RUNNING, BLOCKED, DEAD
        }
    
        public interface DiscardPolicy {
    
            void discard() throws DiscardException;
        }
    
        public static class DiscardException extends RuntimeException {
    
            public DiscardException(String message) {
                super(message);
            }
        }
    
        private static class WorkerTask extends Thread {
    
            private volatile TaskState taskState = TaskState.FREE;
    
            public WorkerTask(ThreadGroup group, String name) {
                super(group, name);
            }
    
            public TaskState getTaskState() {
                return this.taskState;
            }
    
            public void run() {
                OUTER:
                while (this.taskState != TaskState.DEAD) {
    
                    Runnable runnable;
                    synchronized (TASK_QUEUE) {
                        while (TASK_QUEUE.isEmpty()) {
                            try {
                                taskState = TaskState.BLOCKED;
                                TASK_QUEUE.wait();
                            } catch (InterruptedException e) {
                                System.out.println("Closed.");
                                break OUTER;
                            }
                        }
    
                        runnable = TASK_QUEUE.removeFirst();
                    }
    
                    if (runnable != null) {
                        taskState = TaskState.RUNNING;
                        runnable.run();
                        taskState = TaskState.FREE;
                    }
                }
            }
    
            public void close() {
                this.taskState = TaskState.DEAD;
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            SimpleThreadPool threadPool = new SimpleThreadPool();
            for (int i = 0; i < 40; i++) {
    
                int finalI = i;
                threadPool.submit(() -> {
                    System.out.println("The runnable " + finalI + " be serviced by " + Thread.currentThread() + " start.");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("The runnable " + finalI + " be serviced by " + Thread.currentThread() + " finished.");
                });
    
                //System.out.println("======================");
    
            }
    //        Thread.sleep(4000);
    //        threadPool.shutdown();
    //        threadPool.submit(() -> System.out.println("============="));
        }
    }
    
    Pool#Min:4,Active:8,Max:12,Current:4,QueueSize:0
    The runnable 2 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 3 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 1 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 0 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 3 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The runnable 4 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 1 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 5 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 2 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    The runnable 6 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 0 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 7 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 8 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] start.
    The runnable 9 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] start.
    The pool incremented to active.
    The runnable 10 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] start.
    Pool#Min:4,Active:8,Max:12,Current:8,QueueSize:29
    The runnable 11 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] start.
    The runnable 4 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The runnable 12 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 7 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 13 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 5 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 6 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    The runnable 14 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 15 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 9 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] finished.
    The runnable 16 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] start.
    The runnable 8 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] finished.
    The runnable 10 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] finished.
    The runnable 18 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] start.
    The runnable 17 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] start.
    The runnable 11 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] finished.
    The runnable 19 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] start.
    The runnable 14 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 20 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 15 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    The runnable 13 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 22 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 12 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The runnable 21 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 23 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 24 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] start.
    The runnable 25 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] start.
    The runnable 26 be serviced by Thread[SIMPLE_THREAD_POOL-10,5,Pool_Group] start.
    The pool incremented to max.
    Pool#Min:4,Active:8,Max:12,Current:12,QueueSize:13
    The runnable 27 be serviced by Thread[SIMPLE_THREAD_POOL-11,5,Pool_Group] start.
    The runnable 18 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] finished.
    The runnable 19 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] finished.
    The runnable 29 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] start.
    The runnable 16 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] finished.
    The runnable 30 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] start.
    The runnable 17 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] finished.
    The runnable 31 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] start.
    The runnable 28 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] start.
    The runnable 20 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 32 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] start.
    The runnable 23 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The runnable 33 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] start.
    The runnable 21 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    The runnable 22 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 34 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] start.
    The runnable 35 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] start.
    The runnable 24 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] finished.
    The runnable 25 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] finished.
    The runnable 36 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] start.
    The runnable 26 be serviced by Thread[SIMPLE_THREAD_POOL-10,5,Pool_Group] finished.
    The runnable 37 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] start.
    The runnable 38 be serviced by Thread[SIMPLE_THREAD_POOL-10,5,Pool_Group] start.
    The runnable 27 be serviced by Thread[SIMPLE_THREAD_POOL-11,5,Pool_Group] finished.
    The runnable 39 be serviced by Thread[SIMPLE_THREAD_POOL-11,5,Pool_Group] start.
    The runnable 29 be serviced by Thread[SIMPLE_THREAD_POOL-7,5,Pool_Group] finished.
    The runnable 31 be serviced by Thread[SIMPLE_THREAD_POOL-4,5,Pool_Group] finished.
    The runnable 30 be serviced by Thread[SIMPLE_THREAD_POOL-5,5,Pool_Group] finished.
    The runnable 28 be serviced by Thread[SIMPLE_THREAD_POOL-6,5,Pool_Group] finished.
    ==========Reduce=========
    The runnable 35 be serviced by Thread[SIMPLE_THREAD_POOL-3,5,Pool_Group] finished.
    The runnable 32 be serviced by Thread[SIMPLE_THREAD_POOL-2,5,Pool_Group] finished.
    The runnable 33 be serviced by Thread[SIMPLE_THREAD_POOL-0,5,Pool_Group] finished.
    The runnable 34 be serviced by Thread[SIMPLE_THREAD_POOL-1,5,Pool_Group] finished.
    Closed.
    Pool#Min:4,Active:8,Max:12,Current:8,QueueSize:0
    Closed.
    Closed.
    Closed.
    The runnable 38 be serviced by Thread[SIMPLE_THREAD_POOL-10,5,Pool_Group] finished.
    The runnable 36 be serviced by Thread[SIMPLE_THREAD_POOL-8,5,Pool_Group] finished.
    The runnable 37 be serviced by Thread[SIMPLE_THREAD_POOL-9,5,Pool_Group] finished.
    The runnable 39 be serviced by Thread[SIMPLE_THREAD_POOL-11,5,Pool_Group] finished.
    Pool#Min:4,Active:8,Max:12,Current:8,QueueSize:0
    Pool#Min:4,Active:8,Max:12,Current:8,QueueSize:0
    Pool#Min:4,Active:8,Max:12,Current:8,QueueSize:0
    

    相关文章

      网友评论

          本文标题:Java多线程13 自定义线程池

          本文链接:https://www.haomeiwen.com/subject/cefbrqtx.html