除了我释放搜寻器时有效:
public void setCrawlerFree(WebCrawler w)
{
synchronized(myFreeCrawlers)
{
synchronized(numToGo)
{
myFreeCrawlers.add(w);
myFreeCrawlers.notifyAll();
numToGo--;
numToGo.notify();
}
}
}
搜寻器完成后,我可以将其重新添加到列表中。我还想从我仍然需要做的事情中减去1。我有一个主线程等待numToGo等于0。我在numToGo.notify()上收到一个IllegalMonitorStateException,但是由于它在同步块中,所以这并不意味着我拥有它吗?
最佳答案
考虑将其重写为ExecutorService。
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,
maximumPoolSize, keepAliveTime, timeUnit,
new LinkedBlockingQueue<Runnable>());
executor.submit(new Callable<...>() { ... });
这将大大简化您的代码并消除线程同步问题。