应该有一个前沿对象 - 持有一组已访问和等待爬行的URL。
应该有一些线程负责爬取网页。
还应该有一些控制器对象来创建爬行线程。
我不知道哪种架构会更快,更易于扩展。如何划分职责以尽可能减少同步次数,并最小化检查当前URL是否已经被访问。
控制器对象是否应负责向工作线程提供新的URL - 这意味着工作线程将需要爬行所有给定的URL,然后休眠未定义的时间。控制器将解释这些线程,因此爬行线程应该处理InterruptedException(在Java中它有多昂贵 - 看起来异常处理并不是非常快)。或者控制器只是启动线程,让爬行线程自己获取前沿?