作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在一个线程中打印奇数,在另一个线程中打印偶数。我尝试创建两个线程并在 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"?
您传入一个原语。 counter++;
仅在方法内部有意义,对外部世界没有影响。 count
引用方法参数,而不是字段 this.count
。
没有根据条件 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/
我是一名优秀的程序员,十分优秀!