我有一个GUI,GUI正在启动另一个线程(Java)。这个帖子正在启动一个爬行很多网站的类。现在我想在GUI中显示有多少网站被抓取以及剩下多少网站。 我想知道什么是最好的解决方案。
首先想法是在GUI中启动计时器并定期询问爬虫剩下多少。但我觉得这很脏......
然后可以将GUI传递给爬虫,每次准备好的网站数量发生变化时,它都会调用GUI方法。但我认为那不是更好吗?
做这样的事情的最佳方式是什么?
答案 0 :(得分:1)
取决于。
询问抓取工具完成了多少工作并不是一个坏主意。好处是您可以实际控制何时发生更新并且可以平衡负载。
缺点是信息可能会很快失效并且您可能永远无法获得准确的结果,因为当您读取值时,爬虫可能已经更改了它们。
您可以让爬虫提供一个回调接口,GUI注册到该接口,当爬虫更新它的状态时,回调到GUI。
这里的问题是UI可能会被结果淹没,导致它试图跟上时滞后。同样,当爬虫正在触发这些通知时,它不会正常工作......
(假设挥杆)
在任何一种情况下,您都需要确保您对UI所做的任何想法都是在Event Dispatching Thread中制作的。这意味着如果您使用回调方法,则返回的更新将来自爬网程序线程上下文。您需要使用EDT重新同步这些内容。
在这种情况下,您只需使用SwingWorker
即可为您提供将更新同步回EDT的机制。
查看Concurrency in Swing了解详情
答案 1 :(得分:0)
向您的线程注册一个回调函数。当您的数据变脏时,调用此回调函数以通知GUI线程更新。不要忘记使用同步。