我知道在这个网站上已经讨论过类似的问题,但是考虑到一个具体的例子,我还没有得到他们的帮助。我可以在理论上掌握 notify() 和notifyAll()
关于Thread
“唤醒”的区别,但是当使用其中任何一个而不是另一个时,我无法理解它们如何影响程序的功能。因此我设置了以下代码,我想知道使用它们中的每一个有什么影响。我可以从一开始就说它们给出了相同的输出(总和打印了 3 次)。
它们实际上有何不同?有人如何修改程序,以便应用通知或notifyAll
对其功能发挥关键作用(给出不同的结果)?
任务:
class MyWidget implements Runnable {
private List<Integer> list;
private int sum;
public MyWidget(List<Integer> l) {
list = l;
}
public synchronized int getSum() {
return sum;
}
@Override
public void run() {
synchronized (this) {
int total = 0;
for (Integer i : list)
total += i;
sum = total;
notifyAll();
}
}
}
线:
public class MyClient extends Thread {
MyWidget mw;
public MyClient(MyWidget wid) {
mw = wid;
}
public void run() {
synchronized (mw) {
while (mw.getSum() == 0) {
try {
mw.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Sum calculated from Thread "
+ Thread.currentThread().getId() + " : " + mw.getSum());
}
}
public static void main(String[] args) {
Integer[] array = { 4, 6, 3, 8, 6 };
List<Integer> integers = Arrays.asList(array);
MyWidget wid = new MyWidget(integers);
Thread widThread = new Thread(wid);
Thread t1 = new MyClient(wid);
Thread t2 = new MyClient(wid);
Thread t3 = new MyClient(wid);
widThread.start();
t1.start();
t2.start();
t3.start();
}
}
更新: 我明确地写了它。无论使用 notify 还是 notifyAll,结果都是相同的: Sum 从 Thread 12 计算:27 Sum 从 Thread 11 计算:27 Sum 从 Thread 10 计算:27
因此我的问题是:有什么区别?