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在执行相同操作的线程上使用wait/notify方法_Java_Multithreading - Fatal编程技术网

Java在执行相同操作的线程上使用wait/notify方法

Java在执行相同操作的线程上使用wait/notify方法,java,multithreading,Java,Multithreading,我试图理解Java上的监视器,我遇到的问题是如何让运行相同同步方法的线程等待? 我试图制作一个简单的程序,让3个线程使用相同的方法添加到N元素1中,总共10000次,我想知道当一个线程正在添加方法时,如何让其他线程等待,如果我同时启动所有线程,那么在添加完方法后通知所有线程 这是我编写的程序,没有使用等待/通知函数: class Swapper implements Runnable{ int number; Swapper(int number){ this.n

我试图理解Java上的监视器,我遇到的问题是如何让运行相同同步方法的线程等待? 我试图制作一个简单的程序,让3个线程使用相同的方法添加到N元素1中,总共10000次,我想知道当一个线程正在添加方法时,如何让其他线程等待,如果我同时启动所有线程,那么在添加完方法后通知所有线程

这是我编写的程序,没有使用等待/通知函数:

class Swapper implements Runnable{
    int number;
    Swapper(int number){
        this.number=number;
    }
    @Override
    public void run() {
        while (mainClass.counter>0){
            mainClass.incArrayElement(number);
        }
    }
}
public class mainClass {
    public static volatile int counter = 10000;
    public static volatile int[] testArray = new int[]{0,0,0};
    public static synchronized void incArrayElement(int index){
        if (counter>0) {
            testArray[index - 1]++;
            counter--;
        }
        else {
            return;
        }
    }
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(new Swapper(1));
        Thread thread2 = new Thread(new Swapper(2));
        Thread thread3 = new Thread(new Swapper(3));
        thread1.start();
        thread2.start();
        thread3.start();
        thread1.join();
        thread2.join();
        thread3.join();
        int checkSum = 0;
        for (int i = 0; i < testArray.length; i++) {
            System.out.println(testArray[i]);
            checkSum+=testArray[i];
        }
        System.out.println(checkSum);
    }
}

当线程调用类的同步方法“InborayElement”时,它获取该对象的锁,只要获取锁的前一个线程没有释放锁,任何新线程都不能调用同一对象的任何同步方法。因此,所有其他线程将被阻塞,直到执行完成


既然线程已经被阻塞并正在等待,那么为什么需要让线程调用wait呢。

不幸的是,您的示例选择得不好

声明为synchronized的方法的控制方式是其他线程无法调用它,除非它已完成执行。然后其中一个线程再次调用此方法。”因为你无法控制哪个线程,所以不能真正告诉它。使用wait和notify函数也不会让您控制此操作。所以,如果这就是你想要的,你就无法实现你想要的。这对你来说仍然是不确定的


如果只是确保一次只有一个线程调用该方法,那么您已经有了该行为,不需要等待或通知。

您的问题到底是什么?因此,目标是让其他线程在执行同步方法时使用wait方法,然后在同步方法完成后通知他们。那么我应该在哪里添加wait方法呢?