Java多线程 自定义线程池详情

作者:冬日毛毛雨 时间:2022-12-02 09:22:08 

主要介绍:

  • 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

来源:https://juejin.cn/post/7021394644621590535

标签:Java,多线程,线程池
0
投稿

猜你喜欢

  • InterlliJ IDEA2020新建java web项目找不到Static Web的解决

    2022-04-11 19:54:27
  • java 使用POI合并两个word文档

    2022-09-30 12:22:54
  • java的Builder原理和实现详解

    2023-09-11 22:46:01
  • 在Java的Hibernate框架中使用SQL语句的简单介绍

    2022-06-13 15:54:15
  • Spring Boot实现发送邮件

    2023-11-08 22:19:40
  • Spring Boot ActiveMQ连接池配置过程解析

    2023-11-08 23:08:02
  • Android 实现左滑出现删除选项

    2021-05-28 12:05:59
  • java线程组构造方法源码解析

    2022-11-24 08:58:26
  • 猜数游戏java实现代码

    2023-01-05 18:39:28
  • SpringMVC Restful api接口实现的代码

    2023-11-29 12:34:27
  • Android实现清除单个域名的cookie

    2021-10-09 01:57:52
  • 关于C# 类的封装详情

    2023-11-29 05:38:20
  • C#加密知识整合 (AES,MD5,RSA,SHA256)

    2023-07-19 09:09:13
  • RocketMQ源码解析topic创建机制详解

    2023-03-16 01:06:23
  • Java线程安全的计数器简单实现代码示例

    2023-11-09 15:41:57
  • Java JNDI案例详解

    2022-06-09 07:56:35
  • Spring的IOC控制反转详解

    2023-08-24 02:50:50
  • C# 异步多线程入门基础

    2022-01-19 05:23:05
  • C#实现二叉排序树代码实例

    2021-10-10 06:26:12
  • Android Fragment概述及用法

    2022-08-23 15:54:22
  • asp之家 软件编程 m.aspxhome.com