线程池
三大方法 7大参数 4种拒绝手册
池化技术
程序的运行 本质 占用系统的资源!优化资源的使用 !=>池化技术
线程池 连接池 内存池 对象池 创建 销毁 十分浪费资源
池化技术 事先准备一些资源 有人要用,就来这里拿 用完之后还给我
线程池的好处
1.降低资源的消耗
2.提高响应的速度
3.方便管理
线程复用,可以控制最大并发数 管理线程
三大方法
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大参数
本质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;
}
手动创建一个线程池
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();
}
}
}
最大线程到底该如何定义?(调优)
//1.CPU 密集型 几核 就是几 可以保证Cpu的效率最高
Runtime.getRuntime().availableProcessors();
//2.IO密集型 判断你程序中十分耗IO的线程