多线程
3.1 创建线程
创建线程的三种方法
- 继承Thread类
- 实现Runnable接口(多用 因为继承只能单继承)
- 实现callable接口
3.2 线程状态
- Thread t=new Thread(); 创建线程进入新生状态 ,有自己的工作空间 从主存拷贝数据
- 调用start() 方法进入就绪状态,并不意味着马上执行。进入就绪的四种方法
- start()
- 解除阻塞
- yield 主动让出cpu 避免资源占用过多 调用yield后没有其他等待执行的线程 当前线程会马上恢复
- jvm根据调度算法切换线程
- 调度到这个线程的时候进入运行状态 开始执行线程体
- 遇到sleep() wait() 或者同步锁定的时候 从运行状态进入阻塞状态 代码停止执行 不保证调用以上方法立即阻塞。阻塞事件结束后,进入就绪状态 等待cpu的重新调度。。 阻塞4种原因
- sleep() 仍占用资源 调用sleep后 没有其他等待执行的线程 当前线程也不会马上恢复
- wait() 不占用资源
- join() 阻塞指定线程 等待另一个线程执行完
- 等待IO操作 read write
setDaemon()
- 将指定线程设置为后台线程,守护线程
- 创建用户线程的线程结束时,后台线程也随之消亡
- 只能在线程启动之前把它设为后台线程
setPriority (int newPriority) getPriority
- 线程优先级代表概率
- 范围1-10 默认5
stop()
- 停止线程 不推荐使用 想办法让代码执行完自己结束
3.3 线程的其他方法
- isAlive()
- getName()
- setName()
- currentThread()
3.4 线程通信
final void wait() 线程等待 直到其他线程通知 会释放锁
final void wait(long timeout) 指定等待时间
final void notify() 唤醒等待的线程
final void notifyAll() 唤醒同一个对象中所有wait的线程 高级别的优先调度
这些方法只能用在同步方法或者同步块中