线程池主要核心原理
①创建一个空池子
②提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还池子,下回再次提交任务时,不需要创建新的线程,直接复用已有的线程即可
③但是如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待
线程池代码实现
①创建线程池
②提交任务
③所有的任务全部执行完毕,关闭线程池
Executors:线程池的工具类通过调用方法返回不同类型的线程池对象
方法名称 | 说明 |
public static ExecutorService newCachedThreadPool() | 创建一个没有上限的线程池 |
public static ExecutorService newFixedThreadPool(int nThreads) | 创建有上限的线程池,上限为nThreads |
自定义线程池
ThreadPoolEcecutor pool = new ThreadPoolExecutor(
int corePoolSize, //核心线程数量
int maximumPoolSize, //最大线程数量
long keepAliveTime, //空闲线程最大存活时间
TimeUnit unit, //时间的单位
BlockingQueue<Runnable> workQueue, //任务队列
ThreadFactory threadFactory, //创建线程工厂
RejectedExecutionHandler handler//任务的拒绝策略
);
参数很多,注意一下
int count = Runtime.getRuntime().availableProcessors();
System.out.println(count);//java虚拟机能获取最大并行数
线程池多大合适?
CPU密集型运算:最大并行数 + 1
I/O密集型运算:最大并行数*期望CPU利用率*(总时间)/ CPU计算时间
总时间 = CPU计算时间 + 等待时间