/**
* Created by wjz on 2017/3/12.
*/
public class Store {
private final int MAX_SIZE; //仓库的最大容量
private int count; //当前的货物数量
public Store(int n) {
MAX_SIZE = n;
count = 0;
}
//往仓库加货物的方法
public synchronized void add() {
while (count >= MAX_SIZE) {
System.out.println("已经满了");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
//打印当前仓库的货物数量
System.out.println(Thread.currentThread().toString() + "put" + count);
this.notifyAll();
}
//从仓库中拿走货物的方法
public synchronized void remove() {
while(count <= 0) {
System.out.println("空了");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().toString() + "get" + count);
count--;
//仓库还没装满,通知生产者添加货物
this.notify();
}
public static void main(String[] args) {
Store s = new Store(5);
Thread pro = new Producer(s);
Thread con = new Consumer(s);
Thread pro2 = new Producer(s);
Thread con2 = new Consumer(s);
pro.setName("producer");
con.setName("consumer");
pro2.setName("producer2");
con2.setName("consumer2");
pro.start();
pro2.start();
con.start();
con2.start();
}
}
class Producer extends Thread {
private Store s;
public Producer(Store s) {
this.s = s;
}
@Override
public void run() {
while(true) {
s.add();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer extends Thread {
private Store s;
public Consumer(Store s) {
this.s = s;
}
@Override
public void run() {
while (true) {
s.remove();
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
其中wait()、notify()、notifyAll()都是native方法,需要加上synchronized关键字。
Java生产者和消费者
最新推荐文章于 2024-02-10 12:15:21 发布