线程池
五种状态:
shutdown():不在接收任务,但是会将队列与已经执行的任务执行完。
shutdownNow():不在接收任务,并且不在执行任何任务,中断正在执行任务。
为什么需要线程池
1、线程的复用,降低线程的创建与分配所需的时间
不同线程池的实现方式
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, //核心线程数int maximumPoolSize, //最大线程数long keepAliveTime, //时间TimeUnit unit, //时间单位BlockintQueue<Runnable> workQueue, //队列ThreadFactory threadFactory, //线程工厂RejectedExecutionHandler handler //拒绝策略){
核心线程数
在使用线程池的时候已经创建好的线程
最大线程数
最多能创建的线程数量
时间
设置非核心线程的销毁时间
时间单位
时间的单位
队列
排队执行
线程工厂
创建线程
拒绝策略
队列满了,就直接拒绝入队列
1、newCachedThreadPool() 的参数设置
Integer.MAX_VALUE = 2的31次方 - 1 ; //个非核心线程SynchronousQueue //同步队列
步骤:
创建new Runnable
-> 给核心线程(核心线程为0,无法接手)
-> 将任务送入队列中(同步队列,进一个任务出一个任务)
-> 给到非核心线程(创建线程处理任务)
即:
有多少个任务,就创建多少个线程
有线程复用,在线程执行完之后,还有任务需要执行,就会进行复用
2、newFixedThreadPool(10);
(非核心员工)= 核心线程数(CorePoolSize) – 最大线程数(MaximumPoolSize)
3、newSingleThreadExecutor();
大厂不推荐使用以上工具类,推荐根据具体需求自定义线程池
任务提交优先级
任务执行优先级
1、核心线程
2、非核心线程
3、队列存取
线程
线程方法调用的区别
1、new ThreaDeao(),run();
2、new ThreaDeao().start();
通过打断点或者打印当前线程信息可以知道
其中1是在main线程中执行,2是在子线程中执行
线程模型
java虚拟机使用的是 KLT