Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计数器值在多线程处理中处于休眠状态_Java_Multithreading - Fatal编程技术网

Java 计数器值在多线程处理中处于休眠状态

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

我试着在一个线程中打印奇数,在另一个线程中打印偶数。我试着创建两个线程并在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();
    }
}
全文如下:

  • 你传入了一个原语<代码>计数器++仅在方法内部有意义,对外部世界没有影响
    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这是问题所在,一个方法参数隐藏了该字段,因此他没有修改该字段。