gpt4 book ai didi

java - 计数器值在多线程中得到休息

转载 作者:行者123 更新时间:2023-12-02 01:41:56 25 4
gpt4 key购买 nike

我尝试在一个线程中打印奇数,在另一个线程中打印偶数。我尝试创建两个线程并在 run 方法中打印它。

public class OddEven
{
private final int MAX = 10;
private static int counter = 0;
private volatile boolean isOdd = true;

public synchronized void printEven(int counter)
{
try {
if (!isOdd) {
System.out.println(Thread.currentThread().getName() + " " + counter);
counter++;
isOdd = true;
}
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public synchronized void printOdd(int counter)
{
if (isOdd) {
counter++;
System.out.println(Thread.currentThread().getName() + " " + counter);
isOdd = false;
}
notifyAll();
}

public static void main(String[] args) {
OddEven oddEven = new OddEven();

Thread th1 = new Thread() {
public void run() {
while (OddEven.counter < oddEven.MAX) {
oddEven.printEven(OddEven.counter);
}
}
};
th1.setName("even -");
th1.start();

Thread th2 = new Thread() {
public void run() {
while (OddEven.counter < oddEven.MAX) {
oddEven.printOdd(OddEven.counter);
}
}
};
th2.setName("odd -");
th2.start();
}
}

但它像下面一样无限地打印它。

even - 0
odd - 1
even - 0
odd - 1
even - 0
odd - 1

最佳答案

阅读:Is Java "pass-by-reference" or "pass-by-value"?

  1. 您传入一个原语。 counter++;仅在方法内部有意义,对外部世界没有影响。 count引用方法参数,而不是字段 this.count

  2. 没有根据条件 OddEven.counter < oddEven.MAX 进行适当的同步,所以可能会发生不同的事情。

我的建议是删除 isOdd并进行现场检查。例如,

public synchronized void printEven() {
if (counter % 2 != 0) {
System.out.println(Thread.currentThread().getName() + " " + ++counter);
}
}

关于java - 计数器值在多线程中得到休息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54350209/

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