使用wait和notify方法仅能实现2个线程之间通信。后面会更新多个线程之间通信。
Farmer:农夫
Child:小孩
Kuang:框(最多放进10个水果)
如果框中的水果等于10就让农夫休息,如果框中的水果等于0就让小孩休息。
Farmer:
/**
* @author :Lee
* @date :2019/7/16 16:55
* @description:农夫
*/
public class Farmer implements Runnable {
@Override
public void run() {
while (true) {
synchronized (Kuang.kuang) {
if (Kuang.kuang.size() == 10) {
try {
Kuang.kuang.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Kuang.kuang.add("apple");
System.out.println("农夫放进一个苹果,框中还有:" + Kuang.kuang.size() + "个苹果");
Kuang.kuang.notify();
}
try {
TimeUnit.MILLISECONDS.sleep(700);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Child:
/**
* @author :Lee
* @date :2019/7/16 16:55
* @description:小孩
*/
public class Child implements Runnable {
@Override
public void run() {
while (true) {
synchronized (Kuang.kuang) {
if (Kuang.kuang.size() == 0) {
try {
Kuang.kuang.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Kuang.kuang.remove("apple");
System.out.println("小孩吃掉一个苹果,框中还剩:" + Kuang.kuang.size() + "个苹果");
Kuang.kuang.notify();
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Kuang:
/**
* @author :Lee
* @date :2019/7/16 16:54
* @description:容器 (volatile 可不加)
*/
public class Kuang {
volatile public static List<Object> kuang = new ArrayList<>();
}
Test:
/**
* @author :Lee
* @date :2019/7/16 17:03
* @description:
*/
public class TestWait {
public static void main(String[] args) {
new Thread(new Farmer()).start();
new Thread(new Child()).start();
}
}