使用的是继承自Object的两个方法
public final void wait() throws InterruptedException
线程等待
public final void notify()
唤醒在此对象监视器上等待的单个线程
自定义类,定义信息
public class People {
String name ;
int age ;
boolean flag; //默认没有数据,如果是true,说明有数据
}
设置数据
public void run() {
//设置学生数据
while(true) {
synchronized (s) {
//判断有没有数据的情况
if(s.flag) {
try {
s.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(x%2 ==0) {
s.name = "1" ;
s.age = 20 ;
}else {
s.name = "2";
s.age = 30 ;
}
x++ ;
//如果有数据了,更改flag值
s.flag = true ;//有数据了
//通知t2线程消费数据,唤醒
s.notify(); //唤醒t2线程,唤醒之后t1,t2都互相抢占
}
}
}
输出数据
public void run() {
//输出该学生数据
while(true) {
synchronized (s) {
//如果本身消费者有数据
if(!s.flag) {
try {
s.wait();//和网络编程中TCP编程里面的accept() 都属于阻塞式方法
//消费线程等待,等待该线程先输出这些数据(立即释放锁对象)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(s.name +"----"+s.age);//输出名字和年龄
//如果没有数据类,
s.flag = false ;
//通知t1线程,赶紧产生数据
s.notify(); //唤醒单个线程
}
}
}
主函数
public static void main(String[] args) {
//针对同一个对象进行操作
People s = new People() ;
//创建线程类对象
SetThread st = new SetThread(s) ;//public Thread(Runnable target)分配新的 Thread 对象
GetThread gt = new GetThread(s) ;
//创建线程了对象
Thread t1 = new Thread(st) ; //生产者
Thread t2 = new Thread(gt) ;//消费者
//启动线程
t1.start();
t2.start();
}