线程的出现
- 在多核CPU,多线程可以真正意义上并行执行
- 线程是CPU最小的调度基本单位
- 线程的创建,销毁比进程快
- 当进程存在多个同时执行的互不依赖任务,当一个任务被阻塞会导致其他任务也无法执行
线程生命周期
- 线程状态图
- NEW:初始新建状态,还未调用start(),向操作系统提交创建线程,分配资源
- RUNNABLED:可运行状态(可能在运行中)
- yield =)释放cpu退让给同等优先级之上的线程,不释放锁资源,线程状态不变RUNNING -) RUNNABLED
- BLOCKED:同步阻塞,线程进入临界区阻塞队列:synchronized
- WAITING:等待阻塞
- LockSupport.park =) unpark解除
- wait =) notify,notifyAll
- join =) 本质是wait
- TIME_WAITING:超时等待
- LockSupport.parkNaos,partUtil =) unpark解除
- wait(long) =)noyify,notifyAll
- join(long)
- Thread.sleep
- TERMINATED:线程运行终止
线程的启动,终止(中断)
- start() 启动
- 优雅终止线程
- stop() ,suspend()控制线程状态,已被弃用(容易导致资源不正确释放)
- interrput:每个线程都拥有中断标志位
- Thread.interrupted(),会清除中断位(因为中断标志位只能线程自己清除)
- 调用IsInterrupted()判断是否中断(不清除中断位)
- 线程在Runnabled时,只标记中断标志位
- 线程在WAITTING,TIME_WAITTING时,发送中断位标志时会立即进入同步阻塞队列(或者sleep会直接进入RUNNABLE)
线程的应用
- 继承Thread重写run
- 实现Runable接口
- 实现Callable,FutureTask包装
- FutureTask继承Future接口
- Future接口
- 可判断线程是否完成
- 能够中断任务
- 能够获取任务执行结果
线程的应用场景
- 多线程流水线(任务之间有依赖关系)
- 将一个任务分解成多个执行流程,每个执行流程创建一个线程;
- 存储待执行的任务列表
- 提交任务只需要向第一个执行线程提交,责任链模式会将执行完成的任务加入下一个任务队列中
- 线程池,创建新线程执行(任务没有依赖关系)