Thread Pool
Three methods, 7 parameters, 4 rejection manuals
Pooling technology
The running nature of the program takes up system resources! Optimize the use of resources! =>Pooling technology
Thread pool connection pool memory pool object pool creation and destruction is a waste of resources
Pooling technology prepares some resources in advance and someone wants to use it, just come here and return it to me after using it up
Benefits of thread pool
1. Reduce resource consumption
2. Improve the speed of response
3. Convenient management
Thread reuse, you can control the maximum number of concurrent management threads
Three methods
package com.xizi.pool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//Executors 工具类 三大方法
public class Demo01 {
public static void main(String[] args) {
//单个线程
// ExecutorService threadPool = Executors.newSingleThreadExecutor();
//创建一个固定的线程池的大小
// ExecutorService threadPool = Executors.newFixedThreadPool(5);
//可伸缩,遇强则强 遇弱则弱
ExecutorService threadPool = Executors.newCachedThreadPool();
try {
for (int i = 0; i < 100; i++) {
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" ok");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
}
}
7 parameters
本质ThreadPoolExecutor()
源码
public ThreadPoolExecutor(int corePoolSize,//核心线程池大小
int maximumPoolSize,//最大核心线程池大小
long keepAliveTime,//超时了没有人调用就会释放
TimeUnit unit,//超时单位
BlockingQueue<Runnable> workQueue,//阻塞队列
ThreadFactory threadFactory,//线程工厂,创建线程
RejectedExecutionHandler handler //拒绝策略
) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
Create a thread pool manually
package com.xizi.pool;
import java.util.concurrent.*;
//Executors 工具类 三大方法
public class Demo01 {
public static void main(String[] args) {
//单个线程
// ExecutorService threadPool = Executors.newSingleThreadExecutor();
//创建一个固定的线程池的大小
// ExecutorService threadPool = Executors.newFixedThreadPool(5);
//可伸缩,遇强则强 遇弱则弱
// ExecutorService threadPool = Executors.newCachedThreadPool();
//自定义线程池 工作中 ThreadPoolExecutor() 安全
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
2,
5,
3,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
// 1. new ThreadPoolExecutor.AbortPolicy()//银行还有人进来,不处理这个人,抛出异常
// 2. new ThreadPoolExecutor.CallerRunsPolicy() //哪来的去哪里
// 3. new ThreadPoolExecutor.DiscardPolicy() //队列满了 丢掉任务,不会抛出异常
new ThreadPoolExecutor.DiscardOldestPolicy()// 队列满了,尝试和最早的竞争 不会抛出异常
);
try {
for (int i = 0; i < 9; i++) {
//线程池创建
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" ok");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
}
}
How to define the largest thread? (Tuning)
//1. CPU-intensive cores are just a few to ensure the highest efficiency of Cpu
Runtime.getRuntime().availableProcessors();
//2.IO-intensive. Determine the IO-consuming threads in your program