- 用户线程ULT:不需要用户态/核心态切换,速度快;线程阻塞则进程阻塞
- 内核线程KLT:线程的创建、调度、管理由内核完成,速度慢;线程阻塞不会引起进程阻塞
线程的创建:
jvm通过本地方法栈的p_thread接口到内核中创建线程,内核中有线程表存储线程信息
线程的执行:
java程序创建线程后,通过库调度器(操作系统)到内核空间创建线程,并维护到线程表中。此时CPU会根据调度的算法给每个线程分配不同的执行时间(时间片),当时间片结束后,CPU还没执行完,会再分配一定的时间片。
为什么使用线程池?
线程的创建和销毁是很消耗资源的操作,java线程依赖于内核线程,创建线程需要操作系统状态的切换,为避免资源过度消费需要重用线程执行多个任务
线程池优势:
- 重用存在的线程,较少开销,提升性能;
- 提高线程的可管理性,统一分配、调优、监控。
基础线程池的参数:
- 最大线程数
- 核心线程数
- 过期时间
- 过期时间单位
- 阻塞队列 :有界/无界 FIFO
- 线程工厂
- 拒绝策略:
- AbortPolicy 丢掉任务并抛异常
- ·CallerRunsPolicy 调用当前线程执行此无法提交的任务(也就是不使用线程池中的已有线程了)
- DiscardOldestPolicy 丢掉队列最先添加的任务,将其放到队列的最后面
- DiscardPolicy 丢掉任务但不抛异常
线程池执行模型
线程池的五种线程状态
- running 能接受新任务以及处理添加的新任务
- shutdown 不接受新任务,但是可以处理已经添加的任务
- stop 不接受新任务,并且中断正在执行的任务
- tidying 所有任务已经终止,并清理部分队列参数
- terminated 所有线程终止