需求:有一个箱子,一个男孩往里面放水果,等到箱子里满了以后,一个女孩去箱子里去水果,等箱子里水果没了,男孩再放水果进去。
1.定义一个Box类.
package org.demo;
import java.util.LinkedList;
public class Box {
//定义一个集合,指定存放的是水果
private LinkedList<Fruit> box = new LinkedList<Fruit>();
//箱子提供一个put行为,让男孩往里面存放水果
public synchronized void put(Fruit fruit) throws Exception{
//如果箱子是空的,那么就把水果放进箱子
if(box.size()==5){
System.out.println("箱子满了,通知女孩来取...");
//wait之前必须先调用notifyAll()或者notify()方法
this.notifyAll();
//把自己停下,让女孩的线程来执行
//wait方法是让当前正在执行的线程进入一个叫做等待队列的集合中
//等待队列是由key所创建的
//如果wait方法后面还有代码,将全部忽略
//如果当前线程从等待队列出来后将会继续执行wait方法后的代码
//如果当前线程进入了等待队列后,也将释放钥匙
this.wait();
}
box.add(fruit);
Thread.sleep(200);
}
//箱子提供一个take行为让女孩子提取水果
public synchronized Fruit take() throws Exception{
if(box.size()==0){
System.out.println("箱子空了,通知男孩放入水果...");
this.notifyAll();
//将女孩的线程放入key所产生的等待队列
this.wait();
}
Fruit fruit = box.removeFirst();
Thread.sleep(200);
return fruit;
}
}
2.定义一个Boy类,此类继承Thread类.
package org.demo;
public class Boy extends Thread{
private Box box;
public Boy(Box box){
this.box = box;
}
public void run(){
//在一个死循环当中不停的调用put方法
while(true){
Fruit fruit = new Fruit();
try {
box.put(fruit);
System.out.println("男孩放入了一个"+fruit);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3.定义一个girl类,并且继承Thread类.
package org.demo;
public class Girl extends Thread{
private Box box;
public Girl(Box box){
this.box = box;
}
public void run(){
//不停的调用take方法
while(true){
try {
Fruit fruit = box.take();
System.out.println("女孩从盒子中取出一个"+fruit);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
4.定义一个Fruit类
package org.demo;
import java.util.Random;
public class Fruit {
private String[] fruit = {"苹果","香蕉","葡萄","芒果","荔枝"};
private int index;
public Fruit(){
//随机数组,返回一个下标
index = new Random().nextInt(fruit.length);
}
//重写toString方法
public String toString(){
return fruit[index];
}
}
5.演示一下
package org.demo;
public class Demo {
public static void main(String[] args) {
Box box = new Box();
Boy boy = new Boy(box);
Girl girl = new Girl(box);
boy.start();
girl.start();
}
}