gpt4 book ai didi

java - 多线程——奇偶序列

转载 作者:行者123 更新时间:2023-12-03 08:09:45 24 4
gpt4 key购买 nike

我试图解决一个多线程问题,但我在了解它的行为时遇到了困难。

问题是:有 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

但是当我调试代码时,它会以正确的顺序打印数字。因此我无法弄清楚我错过了什么。请帮我。预先感谢您抽出宝贵时间阅读此主题。

最佳答案

据我所知,没有什么可以阻止这种情况的发生,这解释了为什么 2 在输出中显示在 1 之前:

OddThread     EvenThread
---------- ----------
gets odd
gets even
prints even
prints odd

因此,锁需要围绕整个序列“get/print”。

您会注意到,您的输出也永远不会“分开两个数字”。

关于java - 多线程——奇偶序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17620906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com