1.线程状态概述
2.Timed Waiting(计时等待)
3.BLOCKED(锁等待)
4.Waiting(无限等待)
Wating状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。
5.生产者和消费者案例
package com.Study_01;
public class BaoZi {
String pi;
String xian;
boolean flag = false;
}
package com.Study_01;
public class BaoZiPu extends Thread {
// 需要在成员位置创建一个包子变量
private BaoZi bz;
// 使用带参数构造方法,为这个包子变量赋值
public BaoZiPu(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
int count = 0;
// 让包子铺一直生产包子
while (true) {
// 保证只能有一个在执行
synchronized (bz) {
// 对包子的状态进行判断
if (bz.flag == true) {
// 包子铺调用wait方法进入等待状态
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 被唤醒之后,包子铺生产包子
// 增加趣味性 ,交替生产包字
if (count % 2 == 0) {
// 生产 薄皮三鲜馅
bz.pi = "薄皮";
bz.xian = "三鲜馅";
} else {
// 生产 冰皮 牛肉大葱馅
bz.pi = "冰皮";
bz.xian = "牛肉大葱馅";
}
count++;
System.out.println("包子铺正在生产:" + bz.pi + bz.xian + "包子");
// 生产包字需要三秒钟
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 包子铺生产好了包子
// 修改包字状态为 true
bz.flag = true;
// 唤醒吃货线程,让吃货线程吃包子
bz.notify();
System.out.println("包子已经生产好了:" + bz.pi + bz.xian + "包字,吃货可以开始吃了");
}
}
}
}
package com.Study_01;
public class ChiHuo extends Thread {
// 需要在成员位置创建一个包子变量
private BaoZi bz;
// 使用带参数构造方法,为这个包子变量赋值
public ChiHuo(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
// 使用死循环,保证吃货一直吃包子
while (true) {
synchronized (bz) {
// 对包子状态进行判断
if (bz.flag == false) {
// 吃货调用wait方法进入等待状态
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 被唤醒之后的代码,吃包子
System.out.println("吃货正在吃:" + bz.pi+bz.xian+ "的包子");
// 吃货吃完包子
// 修改包字的状态为false
bz.flag = false;
// 吃货唤醒包字铺线程,生产包子
bz.notify();
System.out.println("吃货已经把:"+bz.pi+bz.xian+"的包字吃完了,包子铺开始生产包子");
System.out.println("-----------------------------------------------");
}
}
}
}
package com.Study_01;
public class Demo {
public static void main(String[] args) {
BaoZi bz = new BaoZi();
new BaoZiPu(bz).start();
new ChiHuo(bz).start();
}
}