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

时间:2018-01-11 19:54:47

标签: java multithreading

我试图了解Java上的监视器,而我遇到的问题是如何使运行相同同步方法的线程等待? 我试图制作一个简单的程序,使3个线程使用相同的方法添加到N元素1总共10 000次,我想知道如何让其他线程等待,当一个人正在做添加方法和notifyAll之后如果我能同时开始所有这些,那就完成了。

这是我在没有wait / notify功能的情况下编写的程序:

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);
    }
}

2 个答案:

答案 0 :(得分:1)

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

那么为什么你需要让线程调用wait(),因为它们已被阻塞并等待。

答案 1 :(得分:0)

不幸的是,你的例子没有很好地选择。

声明synchronized的方法是以其他线程无法调用它的方式控制的,除非它已完成执行。然后其中一个线程再次调用此方法。 &#39;哪个帖子&#39;真的不能被告知,因为你无法控制它。使用waitnotify函数也无法让您对此进行控制。所以如果这就是你要找的东西,你就无法实现你想要的。它对你来说仍然是不确定的。

如果只是确保一次只有一个线程调用该方法,那么您已经有了这种行为,不需要waitnotify