您好,登錄后才能下訂單哦!
public class Producer extends Thread {
private final CakeQueue cakeQueue;
private static int cakeNo = 0;
public Producer(String name, CakeQueue cakeQueue){
super(name);
this.cakeQueue = cakeQueue;
}
public void run(){
try {
while (true) {
Thread.sleep(1000);
Cake cake = new Cake(createCakeNo());
this.cakeQueue.put(cake);
}
} catch (InterruptedException e) {
}
}
private static synchronized int createCakeNo() {
return cakeNo++;
}
}
public class Consumer extends Thread{
private final CakeQueue cakeQueue;
public Consumer(String name, CakeQueue cakeQueue) {
super(name);
this.cakeQueue = cakeQueue;
}
public void run(){
try {
while (true) {
Cake cake = cakeQueue.take();
Thread.sleep(1000);
}
} catch (InterruptedException e) {
}
}
}
/**
* 蛋糕
*/
public class Cake {
private final int no;
public Cake(int no) {
this.no = no;
}
public int getNo() {
return this.no;
}
public String toString(){
return "[ Cake No." + no + "]";
}
}
/**
* 存放蛋糕的隊列
*/
public class CakeQueue {
private final Cake[] cakeList;
private int head;
private int tail;
private int counter;
public CakeQueue(int num) {
this.cakeList = new Cake[num];
this.head = 0;
this.tail = 0;
this.counter = 0;
}
//同步放入一個蛋糕
public synchronized void put(Cake cake) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + "put:No" + cake.getNo());
while(counter >= cakeList.length){
wait();
}
cakeList[tail] = cake;
tail = (tail + 1) % cakeList.length;
counter++;
notifyAll();
}
//同步獲取一個蛋糕
public synchronized Cake take() throws InterruptedException {
while(counter <= 0){
wait();
}
Cake cake = cakeList[head];
head = (head + 1) % cakeList.length;
counter--;
notifyAll();
System.out.println("------" + Thread.currentThread().getName() + "take:No" + cake.getNo());
return cake;
}
}
public class Main {
public static void main(String[] args) {
CakeQueue cakeQueue = new CakeQueue(3);
new Producer("Producer-1:", cakeQueue).start();
new Producer("Producer-2:", cakeQueue).start();
new Producer("Producer-3:", cakeQueue).start();
new Consumer("Consumer-1:", cakeQueue).start();
new Consumer("Consumer-2:", cakeQueue).start();
new Consumer("Consumer-3:", cakeQueue).start();
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。