原理图
一、产品User类
二、生产者
/**
* 生产者
*/
class Product extends Thread{
private int count = 1;
private User user;
public Product(User user){
this.user = user;
}
@Override
public void run() {
while (true){
synchronized (user){
if(user.flag){
try {
//线程进入到等待状态,需要被唤醒
user.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(count == 1){
user.setId(1);
user.setName("紫炎易霄");
user.setAge(21);
}else {
user.setId(6);
user.setName("黑袍萧寻");
user.setAge(66);
}
count = (count+1) % 2;
System.out.println("生产完毕");
user.flag = true;
//唤醒消费者线程
user.notify();
}
}
}
}
三、消费者
/**
* 消费者
*/
class Consumer extends Thread{
private User user;
public Consumer(User user){
this.user = user;
}
@Override
public void run() {
while (true){
synchronized (user){
if(!user.flag){
try {
user.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(user);
user.flag = false;
//唤醒生产者线程
user.notify();
}
}
}
}
四、main方法
public class ProductConsumer {
public static void main(String[] args) {
User user = new User();
//交给生产者生产
Product product = new Product(user);
//消费者消费
Consumer consumer = new Consumer(user);
product.start();
consumer.start();
}
}
五、运行结果
总结
线程之间的通信,生产者和消费者模型,关键点:
1、三要素:生产者、消费者、产品
2、使用synchronized保证线程安全
3、使用wait()方法让线程进入阻塞状态
4、使用notify()方法来唤醒线程,使线程由阻塞状态进入到就绪状态
(wait()必须与synchronized中的对象或类锁进行组合使用)