Java多线程 自定义线程池详情
时间:2022-10-30 11:08:27|栏目: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
上一篇:如何使用Bean Validation 解决业务中参数校验
栏 目:JAVA代码
本文标题:Java多线程 自定义线程池详情
本文地址:http://www.codeinn.net/misctech/217710.html