使用等待唤醒机制完成卖出100份水果的功能
first step
//create a class :fruit
public class Fruit {
private int stock;
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
public Fruit(int stock) {
this.stock = stock;
}
public Fruit() {
}
}
second step
//create a NetShop Class ,it is the first thread
public class NetShop implements Runnable {
private Fruit fruit;
NetShop(Fruit fruit){
this.fruit = fruit;
}
@Override
public void run() {
while( fruit.getStock() > 0 ) { //roundabout
synchronized (fruit) { //synchronized lock
if(fruit.getStock() % 2 == 1 ) { // if true , waiting.
try {
fruit.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(fruit.getStock() > 0) { *//avoid negative number*
int num = fruit.getStock() - 1;
System.out.println("NetShop is selling No." + (100 - num) + " fruit , remains is " + num);
fruit.setStock(num);
}
fruit.notify();
}
}
}
}
third step
//create second thread called FrontShop
public class FrontShop implements Runnable {
private Fruit fruit;
FrontShop(Fruit fruit){
this.fruit = fruit;
}
@Override
public void run() {
while(fruit.getStock() > 0) {
synchronized (fruit) {
if( fruit.getStock() % 2 == 0) {
try {
fruit.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (fruit.getStock() > 0) {
int num = fruit.getStock() - 1;
System.out.println("FrontShop is selling No." + (100 - num) + " fruit , remains is " + num);
fruit.setStock(num);
}
fruit.notify();
}
}
}
}
latest step
//create a Test class file.
public class Test {
public static void main(String[] args) {
Fruit fruit = new Fruit(100);
FrontShop fs = new FrontShop(fruit);
Thread thread1 = new Thread(fs,"FrontShop");
thread1.start();
NetShop netShop = new NetShop(fruit);
Thread thread2 = new Thread(netShop,"NetShop");
thread2.start();
System.out.println(thread1.getName() + "");
System.out.println(thread2.getName() + "");
}
}