题目:两个人,一个放苹果,一个人拿苹果。当苹果总数为5时,不能放苹果;当苹果总数为0时不能取。放苹果和取苹果两个过程为独立的过程。模拟该过程。
package apple;
public class TestApple {
public static void main(String[] args) {
Apple apple = new Apple();
Thread tt =new TakeThread(apple);
Thread pt = new PutThread(apple);
// Thread tt2 =new TakeThread(apple);
// Thread pt2 = new PutThread(apple);
tt.start();
pt.start();
// tt2.start();
// pt2.start();
}
}
class Apple {
private int number; //初始苹果数
private int Capacity; //容量
public Apple() {
this.number = 0;
this.Capacity = 5;
}
public Apple(int number, int capacity) {
this.number = number;
this.Capacity = capacity;
}
public synchronized void putApple(){
while(number>=Capacity){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number++;
System.out.println(number);
notify();
}
public synchronized void takeApple(){
while(number<=0){ //用while不用if
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number--;
System.out.println(number);
notify();
}
}
class TakeThread extends Thread {
private Apple apple;
public TakeThread(Apple apple) {
this.apple = apple;
}
public void run() {
while(true){
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
apple.takeApple();
}
}
}
class PutThread extends Thread {
private Apple apple;
public PutThread(Apple apple) {
this.apple = apple;
}
public void run() {
while(true){
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
apple.putApple();
}
}
}