【发布时间】:2011-10-30 21:23:33
【问题描述】:
我不完全理解wait 和notify(Object)是如何工作的,因此我不得不将我的尝试缩减到以下代码部分。
Main.java:
import java.util.ArrayList;
class Main
{
public static Main main = null;
public static int numRunners = 4;
public static ArrayList<Runner> runners = null;
public static void main(String[] args)
{
main = new Main();
}
Main()
{
runners = new ArrayList<Runner>(numRunners);
for (int i = 0; i < numRunners; i++)
{
Runner r = new Runner();
runners.add(r);
new Thread(r).start();
}
System.out.println("Runners ready.");
notifyAll();
}
}
Runner.java:
class Runner implements Runnable
{
public void run()
{
try
{
Main.main.wait();
} catch (InterruptedException e) {}
System.out.println("Runner away!");
}
}
目前我在调用Main.main.wait(); 时收到 IllegalMonitorStateException,但我不明白为什么。据我所知,我需要同步Runner.run,但这样做我假设它只会通知一个线程,而我的想法是通知所有线程。
我查看了java.util.concurrent,但找不到合适的替代品(也许我只是遗漏了一些东西)。
【问题讨论】:
-
你永远不应该使用等待和通知。它们在旧 Java 中是必需的,但现在它们应该只供编写库的人使用。您现在应该使用 java.util.concurrent 中的设施。
-
同意toto2,即使您添加了同步,此代码也不起作用。如果 main 在所有其他线程到达 wait() 之前调用 notifyAll 会发生什么?
标签: java multithreading concurrency