我必須使用多線程編寫這個產品消費者應用程序。我編寫了下面的java代碼,但卻無法弄清楚它出錯的地方。另外我想知道我的課程設計是否合適,或者我的編碼風格是否合適。線程鎖和條件變量,生產者消費者示例
在此先感謝!
編輯
我已經修改了農產品消費代碼:但它仍然有一些問題。
import java.util.*;
import java.lang.Thread;
public class pc_example {
public static void main (String [] args) {
Store store = new Store(10);
produce p = new produce(store);
consume c = new consume (store);
p.start();
c.start();
}
}
class Store {
public Queue<Integer> Q;
public int max_capacity;
Store(int max_capacity) {
Q = new LinkedList<Integer>();
this.max_capacity = max_capacity;
}
}
class produce extends Thread {
private Store store;
private int element;
produce (Store store) {
this.store = store;
this.element = 0;
}
public void put() {
synchronized (store) {
if (store.Q.size() > store.max_capacity) {
try {
wait();
} catch (InterruptedException e) {}
}
else {
element ++;
System.out.println("Producer put: " + element);
store.Q.add(element);
notify();
}
}
}
}
class consume extends Thread {
private int cons;
private Store store;
consume (Store store) {
this.store = store;
this.cons = 0;
}
public void get() {
synchronized (store) {
if (store.Q.size() == 0) {
try {
wait();
} catch (InterruptedException e) {}
}
else {
int a = store.Q.remove();
System.out.println("Consumer put: " + a);
cons++;
if (store.Q.size() < store.max_capacity)
notify();
}
}
}
}
好吧,我同意存在兩個不同的Q對象。 HOwever我不明白需要同步Q對象,一旦我同步方法本身? – 2011-06-18 03:01:09
如果你調用'object2.notify()',它會通知一個等待該對象的線程('object2')。在你的(當前)例子中,你等待一個對象並通知另一個對象 - 它們之間沒有連接。 (我從'produce()'方法中刪除'synchronized',因爲它不是必需的。) – dacwe 2011-06-18 08:43:22