我有一个 GUI,GUI 正在启动另一个线程(Java)。该线程正在启动一个正在爬取许多网站的类。现在我想在 GUI 中显示抓取了多少网站以及剩下多少网站。我想知道什么是最好的解决方案。
第一个想法是在 GUI 中启动一个计时器,并定期询问爬虫还剩多少。但我想这很脏......
然后可以将 GUI 传递给爬虫,每次准备好的网站数量发生变化时,它都会调用一个 GUI 方法。但我不认为这更好吗?
做这样的事情的最好方法是什么?
我有一个 GUI,GUI 正在启动另一个线程(Java)。该线程正在启动一个正在爬取许多网站的类。现在我想在 GUI 中显示抓取了多少网站以及剩下多少网站。我想知道什么是最好的解决方案。
第一个想法是在 GUI 中启动一个计时器,并定期询问爬虫还剩多少。但我想这很脏......
然后可以将 GUI 传递给爬虫,每次准备好的网站数量发生变化时,它都会调用一个 GUI 方法。但我不认为这更好吗?
做这样的事情的最好方法是什么?
这取决于。
询问爬虫它完成了多少工作并不是一个坏主意。好处是您可以实际控制何时发生更新并可以平衡负载。
缺点是信息可能很快就会过时,您可能永远无法获得准确的结果,因为当您读取这些值时,爬虫可能已经更改了它们。
您可以让爬虫提供一个回调接口,GUI 注册到该接口,当爬虫更新它的状态时,回调到 GUI。
这里的问题是 UI 可能会被结果淹没,导致在试图跟上时出现滞后。同样,当爬虫发出这些通知时,它并没有做它的工作......
(假设摇摆)
无论哪种情况,您都需要确保您对 UI 所做的任何想法都是在事件调度线程中产生的。这意味着如果您使用回调方法,返回的更新将来自爬虫线程上下文。您需要将这些与 EDT 重新同步。
在这种情况下,您可以简单地使用 aSwingWorker
它为您提供将更新同步回 EDT 的机制。
查看Swing 中的并发以获取更多详细信息
向您的线程注册一个回调函数。当你的数据变脏时,调用这个回调函数来通知 GUI 线程更新。不要忘记使用同步。