流程圖
java
package thread.stack;
import java.util.ArrayList;
import java.util.List;
/**
* 自制的棧(數據結構)
*
*/
public class Stack {
//堆棧數據結構實現的輔助變量
private List myList = new ArrayList();
/**
* 從集合中往外出字符
*/
public synchronized char pop() {
char temp;
// 當集合爲空的時候直接等待
// 把資源直接交給另外一個線程運行
while (myList.size() == 0) {
try {
System.out.println("集合中元素爲空,等待生產者生產元素……");
wait();
} catch (Exception e) {
e.printStackTrace();
}
}
// 獲得最後一個字符
temp = ((Character) (myList.get(myList.size() - 1))).charValue();
// 刪除最後一個元素
myList.remove(myList.size() - 1);
// 當前線程的名字
String threadName = Thread.currentThread().getName();
System.out.println("消費者" + threadName + ":" + "消費了字符" + temp);
return temp;
}
/**
* 往集合裏面添加字符
* @param c
*/
public synchronized void push(char c) {
// 添加元素
myList.add(c);
//當前線程的名字
String threadName = Thread.currentThread().getName();
System.out.println("生產者" + threadName + ":" + "生產了字符" + c);
// 喚醒其餘線程
this.notify();
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package thread.stack;
/**
* 消費者類
*
*/
public class Consumer implements Runnable {
private Stack stack;
/**
* 生產者構造方法
*/
public Consumer(Stack stack) {
this.stack = stack;
}
/**
* 消費商品方法
*/
public void con() {
char c;
for (int i = 0; i < 200 i br>
// 集合(堆棧)中輸出元素
c = stack.pop();
try {
// 等待30毫秒
Thread.sleep(30);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void run() {
this.con();
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package thread.stack;
/**
* 生產者類
*
*/
public class Producer implements Runnable {
private Stack stack;
/**
* 生產者構造方法
*/
public Producer(Stack stack) {
this.stack = stack;
}
/**
* 生產商品方法
*/
public void pro() {
char c;
for (int i = 0; i < 200 i br>
// 隨機生成大寫字母字符
c = (char) (Math.random() * 26 + 'A');
//往集合(堆棧)中添加元素
stack.push(c);
try {
//等待30毫秒
Thread.sleep(30);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void run() {
this.pro();
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package thread.stack;
/**
* 客戶端測試類
*
*/
public class Client {
public static void main(String[] args) {
//1.準備堆棧數據結構
Stack stack = new Stack();
//2.準備生產者線程
Producer producer1 = new Producer(stack);
Thread t1 = new Thread(producer1);
Producer producer2 = new Producer(stack);
Thread t2 = new Thread(producer2);
//3.準備消費者線程
Consumer consumer1 = new Consumer(stack);
Thread t3 = new Thread(consumer1);
Consumer consumer2 = new Consumer(stack);
Thread t4 = new Thread(consumer2);
t3.start();
t4.start();
t1.start();
t2.start();
}
}數據結構