线程通讯wait¬ify
相关概念
-
锁:解决线程间冲突的问题
-
wait¬ify:解决线程间协作的问题
-
wait和sleep的区别
wait期间对象锁是释放的,而sleep只能延时,并未释放锁
-
调用wait方法:暂停正在执行的线程,放弃CPU执行权,并释放资源锁
-
调用notify方法:唤醒暂停的线程使之运行
生产者&消费者模型
场景逻辑:定义两个类,分别为商店和顾客。顾客随机点可乐,鸡翅等食物,商店生产对应的食物,然后顾客食用食物
核心:定义一个全局对象实现多线程情况下线程间的可见,以实现线程协作
package com.noneplus;
public class Main {
private final Object flag = new Object();
private static String[] food = {"可乐", "鸡翅", "鸡腿", "披萨"};
private static String foodType;
public static void main(String[] args) {
Main main = new Main();
Thread store = main.new Store();
Thread customer1 = main.new Customer();
store.start();
customer1.start();
}
class Store extends Thread {
@Override
public void run() {
while (true) {
synchronized (flag) {
flag.notify();
if (Main.foodType==null)
{
System.out.println("暂无订单");
}
else
{
System.out.println("生产:" + Main.foodType);
try {
flag.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
class Customer extends Thread {
@Override
public void run() {
while (true) {
synchronized (flag) {
flag.notify();
Main.foodType = Main.food[(int) (Math.random() * 3)];
System.out.println("订购:" + Main.foodType);
try {
flag.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("食用: " + Main.foodType);
System.out.println("===============");
}
}
}
}
}
订购:可乐
生产:可乐
食用: 可乐
===============
订购:鸡腿
生产:鸡腿
食用: 鸡腿
===============
订购:鸡翅
生产:鸡翅
食用: 鸡翅