我试图了解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);
}
}
答案 0 :(得分:1)
当一个线程调用你的类的同步方法'incArrayElement'时,它获取该对象的锁,任何新线程都不能调用同一个对象的任何同步方法,只要获得锁的前一个线程不释放锁。因此,所有其他线程将被阻塞,直到执行完成。
那么为什么你需要让线程调用wait(),因为它们已被阻塞并等待。
答案 1 :(得分:0)
不幸的是,你的例子没有很好地选择。
声明synchronized
的方法是以其他线程无法调用它的方式控制的,除非它已完成执行。然后其中一个线程再次调用此方法。 &#39;哪个帖子&#39;真的不能被告知,因为你无法控制它。使用wait
和notify
函数也无法让您对此进行控制。所以如果这就是你要找的东西,你就无法实现你想要的。它对你来说仍然是不确定的。
如果只是确保一次只有一个线程调用该方法,那么您已经有了这种行为,不需要wait
或notify
。