线程状态

一、线程状态
在API中java.lang.Thread.state介绍了六种线程状态!

参考视频:
https://www.bilibili.com/video/av62541169/?p=312

  1. new Thread/Thread子类();—>新建状态
  2. 执行start()方法
    • 抢到cpu—>运行状态(Runnable)run()方法结束/stop()过时就会到死亡状态(Terminated)
    • 没抢到cpu—>阻塞状态(Blockerd)
  3. 执行sleep(long)方法 / wait(long)方法—>睡眠/休眠状态(Timed_waiting)
    • 睡眠结束,cpu不空闲—>阻塞状态
    • 睡眠结束,cpu空闲—>运行状态
  4. 执行Object.wait(无参数)—>无限/永久等待状态
  5. 执行Object.notify()—>只有这个方法才能唤醒。

二、等待唤醒案例

  • 等待唤醒案例:线程之间的通信
      创建一个顾客线程(消费者):告知老板需要包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待)
      创建一个老板线程(生产者):花了s秒生产包子,包子做好,调用notify()方法,唤醒顾客吃包子。
  • 注意点:
  1. 顾客和老板线程必须使用同步代码块包裹,而且保证只有一个在执行。(使用同步技术-synchronized(对象)形式)
  2. 同步使用的锁对象必须保证唯一。(只有一个obj对象)
  3. 只有锁对象才可以使用wait和notify方法。(代码中obj.wait()方法/obj.notify()方法)

Object类中的方法:

  1. void wait()
    在其他线程调用此对象的notify()方法/notifyAll()方法前,导致当前线程等待。
  2. void notify()
    唤醒在此对象监控器上等待的单个线程
    会继续执行wait()方法之后的代码
  • 具体实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package dengdaihuanxing;
public class Main {
public static void main(String[] args) {
//创建锁对象(唯一)
Object obj=new Object();
//创建一个顾客线程(消费者)---匿名内部类
new Thread(){
@Override
public void run() {
//保证只有一个执行---同步技术
synchronized(obj) {
System.out.println("告知老板要的包子的种类和数量:");
//调用wait方法---进入无限等待状态
try
{
obj.wait(); //锁对象才可以调用wait方法
}
catch (InterruptedException e)
{
e.printStackTrace();
}
//唤醒之后执行的代码
System.out.println("包子已经做好了,可以吃了!");
}
}
}.start();

//创建一个老板线程(生产者)
new Thread() {
@Override
public void run() {
//花五秒钟做包子
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
//保证只有一个执行---同步技术
synchronized(obj) {
System.out.println("老板5秒后做好包子,可以来吃包子了");
//调用notify()方法唤醒吃包子
obj.notify();//锁对象才可以调用notify方法
}
}
}.start();
}
}

代码结果如下:

1
2
3
4
告知老板要的包子的种类和数量:
(不用输入等待5秒后就会弹出下面的结果)
老板5秒后做好包子,可以来吃包子了
包子已经做好了,可以吃了!

三、Object类中wait带参方法和notify方法

  • 进入TimeWaiting(计时等待)有两种方式:
  1. 使用sleep(long m),在毫秒值结束之后,线程–>Runnable/Blocked状态。
  2. 使用wait(long m):wait方法如果在毫秒值结束之后,还没有被notify方法唤醒,就会自动醒来。
  • 唤醒的方法
  1. notify(): —>唤醒单个线程
  2. notify()All: —>唤醒所有线程

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
,