gpt4 book ai didi

Java 在执行相同操作的线程上使用等待/通知方法

转载 作者:行者123 更新时间:2023-12-02 11:45:45 27 4
gpt4 key购买 nike

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

这是我编写的没有等待/通知功能的程序:

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

最佳答案

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

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

关于Java 在执行相同操作的线程上使用等待/通知方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48214885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com