我正試圖解決一個多線程問題,我正面臨着難以瞭解其行爲。多線程 - 甚至是奇數序列
的問題是: 有2個線程,其同時消耗甚至和奇數號碼。我必須介紹它們之間的線程通信,以自然排序的方式使「消耗」。
這裏是我的代碼
public class EvenOddDemo {
public static void main(String[] args) {
Number n = new Number();
EvenThread et = new EvenThread(n);
OddThread ot = new OddThread(n);
et.start();
ot.start();
}
}
class EvenThread extends Thread {
private Number number;
public EvenThread(Number number) {
this.number = number;
}
@Override
public void run() {
for(int i=0; i<5; i++) {
System.out.println(number.getEven());
}
}
}
class OddThread extends Thread {
private Number number;
public OddThread(Number number) {
this.number = number;
}
@Override
public void run() {
for(int i=0; i<5; i++) {
System.out.println(number.getOdd());
}
}
}
class Number {
private int currentEven = 0;
private int currentOdd = 1;
private volatile String last = "odd";
public synchronized int getEven() {
if("even".equals(last)) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int i = currentEven;
last = "even";
currentEven +=2;
notify();
return i;
}
public synchronized int getOdd() {
if("odd".equals(last)) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int i = currentOdd;
last = "odd";
currentOdd +=2;
notify();
return i;
}
}
和輸出
0
2
1
3
4
5
7
6
8
9
但是,當我調試的代碼,它以正確的順序打印號碼。因此我無法弄清楚我錯過了什麼。請幫幫我。預先感謝您爲此主題準備的時間。
有此功課SO的*衆多*的DUP。這裏是一個:http://stackoverflow.com/questions/6017281/odd-even-number-printing-using-thread?rq=1和另一個http://stackoverflow.com/questions/16689449/printing-even-and-奇數使用兩線程在Java?rq = 1 –
@BrianRoach感謝您的評論。然而,我正在做'notify'和'wait'在相同的'Number'實例..所以它怎麼不適合我? – sanbhat
只是爲了記錄,調試多線程應用程序並不能保證您的行爲正常,它可能會給您一次(或者可能總是)正確的結果,並且永遠不會顯示真正的問題。 –