除了我释放搜寻器时有效:

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<...>() { ... });


这将大大简化您的代码并消除线程同步问题。

10-07 14:27