一、线程状态
在API中java.lang.Thread.state
介绍了六种线程状态!
参考视频:
https://www.bilibili.com/video/av62541169/?p=312
- 先
new Thread/Thread子类();
—>新建状态 - 执行
start()方法
- 抢到cpu—>运行状态(Runnable)–
run()方法结束
/stop()过时
就会到死亡状态(Terminated) - 没抢到cpu—>阻塞状态(Blockerd)
- 抢到cpu—>运行状态(Runnable)–
- 执行
sleep(long)方法
/wait(long)方法
—>睡眠/休眠状态(Timed_waiting)- 睡眠结束,cpu不空闲—>阻塞状态
- 睡眠结束,cpu空闲—>运行状态
- 执行
Object.wait(无参数)
—>无限/永久等待状态 - 执行
Object.notify()
—>只有这个方法才能唤醒。
二、等待唤醒案例
- 等待唤醒案例:线程之间的通信
创建一个顾客线程(消费者):告知老板需要包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待)
创建一个老板线程(生产者):花了s秒生产包子,包子做好,调用notify()方法,唤醒顾客吃包子。 - 注意点:
- 顾客和老板线程必须使用同步代码块包裹,而且保证只有一个在执行。(使用同步技术-synchronized(对象)形式)
- 同步使用的锁对象必须保证唯一。(只有一个obj对象)
- 只有锁对象才可以使用wait和notify方法。(代码中obj.wait()方法/obj.notify()方法)
Object类
中的方法:
void wait()
:
在其他线程调用此对象的notify()方法/notifyAll()方法前,导致当前线程等待。void notify()
:
唤醒在此对象监控器上等待的单个线程
会继续执行wait()方法之后的代码
- 具体实现:
1 | package dengdaihuanxing; |
代码结果如下:
1 | 告知老板要的包子的种类和数量: |
三、Object类中wait带参方法和notify方法
- 进入TimeWaiting(计时等待)有两种方式:
- 使用
sleep(long m)
,在毫秒值结束之后,线程–>Runnable/Blocked状态。 - 使用
wait(long m)
:wait方法如果在毫秒值结束之后,还没有被notify方法唤醒,就会自动醒来。
- 唤醒的方法
notify()
: —>唤醒单个线程notify()All
: —>唤醒所有线程