【发布时间】:2013-07-12 17:43:09
【问题描述】:
我试图解决一个多线程问题,但在了解它的行为时遇到了困难。
问题是: 有 2 个线程同时消耗 even 和 odd 数字。我必须引入它们之间的线程通信,以使“消耗”按自然顺序排列。
这是我的代码
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 上有 许多 重复此作业。这是一个:stackoverflow.com/questions/6017281/… 和另一个 stackoverflow.com/questions/16689449/…
-
@BrianRoach 感谢您的评论。但是我在同一个
Number实例上执行notify和wait.. 那么它对我不起作用? -
仅作记录,调试多线程应用程序并不能保证按照您的预期运行,它可能会一次性(或可能总是)为您提供正确的结果,而不会显示真正的问题。
-
@BrianRoach 虽然老实说我不确定为什么他的代码(与您指向的答案非常相似)不起作用。
标签: java multithreading producer-consumer