Java生命周期管理
线程类
粗粒度
细粒度: 线程之间有同步操作
- 等待
- 通知/唤醒
- 终止
线程状态:
- NEW 刚创建(new)
- RUNNABLE 就绪态(start)
- RUNNING 运行中(run)
- BLOCK 阻塞(sleep)
- TERMINATED 结束
Thread类的部分API已经废弃:(老的,旧的,不安全的)
- 暂停和恢复suspend/resume(有危险的)
- 消亡stop/destroy(危险)
线程阻塞和唤醒
- sleep,时间一到,自己会醒来
- wait/notify/notifyAll,等待,需要别人来唤醒
- join,等待另外一个线程结束
- interrupt,向另外一个线程发送中断信号,该线程收到信号,会触发InterruptException(可解除阻塞),并进行下一步处理。
线程被动地暂停和终止
- 依靠别的线程线程来拯救自己(这种情况很危险,如我打开一个文件或者我拿着一个锁对象,一旦线程进入wait状态,我没有恢复,别人是拿不到东西的)
- 没有及时释放资源
线程主动暂停和终止
- 定期监测共享变量
- 如果需要暂停或者终止,先释放资源,在主动动作
- 暂停:Thread.sleep(),休眠
- 终止:run方法结束,线程终止
多线程死锁
- 每个线程互相持有别人需要的锁(哲学家吃面问题)
- 预防死锁,对资源进行等级排序
守护(后台)线程
- 普通线程的结束,是run方法运行结束
- 守护线程的结束,是run方法运行结束,或main函数结束
- 守护线程永远不要访问资源,如文件或数据库等
线程查看工具jvisualvm
经典问题:
- 生产者消费者问题