线程也叫轻量级进程LWP(Light Weight Process)
两种线程模型
用户级线程ULT:
用户程序实现,不依赖操作系统核心,应用提供创建,同步,调度和管理线程的函数来控制用户线程;不许用户态/内核态切换,速度快;内核对ULT无感知,线程阻塞及进程阻塞。
内核级线程KLT:
系统内核管理线程,内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核完成,效率比ULT慢,比进程操作快。
Java用的时KLT线程模型。
ULT的线程表在个进程中(用户空间),KLT的线程表在CPU中(内核空间)。
Java线程创建是依赖于系统内核的,通过JVM调用系统库创建内核线程,内核线程与Java Thread 1:1映射。
线程池的作用
Java线程依赖于内核线程,创建线程需要进行操作系统状态的切换。为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配,调优与监控。
什么时候使用线程池?
- 单个任务处理时间比较短
- 需要处理的任务量很大
线程池的优势
- 重用存在的线程,减少线程的创建,消亡的开销,提高性能。
- 提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性,可统一分配,调优和监控。
自定义线程池
任务必须实现Runnable或Callable。
final ThreadPoolExecutor pool=new ThreadPoolExecutor(2,3,60,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(