我正试图解决一个多线程问题,我正面临着难以了解其行为。多线程 - 甚至是奇数序列
的问题是: 有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
只是为了记录,调试多线程应用程序并不能保证您的行为正常,它可能会给您一次(或者可能总是)正确的结果,并且永远不会显示真正的问题。 –