线程池

五种状态:


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 = 231次方 - 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