Java 计数器值在多线程处理中处于休眠状态
我试着在一个线程中打印奇数,在另一个线程中打印偶数。我试着创建两个线程并在run方法中打印它Java 计数器值在多线程处理中处于休眠状态,java,multithreading,Java,Multithreading,我试着在一个线程中打印奇数,在另一个线程中打印偶数。我试着创建两个线程并在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) { tr
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();
}
}
全文如下:
count
指的是方法参数,而不是字段this.count
oddeen.counter
上没有进行适当的同步,因此可能会发生不同的情况isOdd
,并当场进行检查。比如说,
public synchronized void printEven() {
if (counter % 2 != 0) {
System.out.println(Thread.currentThread().getName() + " " + ++counter);
}
}
全文如下:
count
指的是方法参数,而不是字段this.count
oddeen.counter
上没有进行适当的同步,因此可能会发生不同的情况isOdd
,并当场进行检查。比如说,
public synchronized void printEven() {
if (counter % 2 != 0) {
System.out.println(Thread.currentThread().getName() + " " + ++counter);
}
}
行
oddeen.print偶数(oddeen.counter)
将一个整数按值传递给print偶数
方法,该方法在执行counter++
时不会更改oddeen.counter
的值,其他答案也指出了这一点
要获得所需的输出,一个选项是删除传递给print偶
和printOdd
方法的参数。还有很多其他的方法来实现你在这里想要做的事情
而且printEven
方法中也有一个错误<代码>计数器++代码>必须在打印语句之前
这将为您提供所需的输出。行
oddeen.print偶数(oddeen.counter)
将一个整数按值传递给print偶数
方法,该方法不会更改oddeen.counter
的值,当它执行计数器+
时,正如其他答案中所指出的那样
要获得所需的输出,一个选项是删除传递给print偶
和printOdd
方法的参数。还有很多其他的方法来实现你在这里想要做的事情
而且printEven
方法中也有一个错误<代码>计数器++代码>必须在打印语句之前
这将为您提供所需的输出。尝试使用AtomicIntegrater(完全不相关,但
isOdd
不必是volatile
,因为它只在同步时被访问)尝试使用AtomicIntegrater(完全不相关,但isOdd
不必是volatile
,因为它只在同步时被访问)他正在使用和修改类的实例变量。这不是问题所在。@Matthew这是问题所在,一个方法param隐藏了该字段,因此他没有修改该字段。他正在使用并修改一个类的实例变量。这不是问题所在。@Matthew这是问题所在,一个方法参数隐藏了该字段,因此他没有修改该字段。