0

我有一个 GUI,GUI 正在启动另一个线程(Java)。该线程正在启​​动一个正在爬取许多网站的类。现在我想在 GUI 中显示抓取了多少网站以及剩下多少网站。我想知道什么是最好的解决方案。

第一个想法是在 GUI 中启动一个计时器,并定期询问爬虫还剩多少。但我想这很脏......

然后可以将 GUI 传递给爬虫,每次准备好的网站数量发生变化时,它都会调用一个 GUI 方法。但我不认为这更好吗?

做这样的事情的最好方法是什么?

4

2 回答 2

1

这取决于。

询问爬虫它完成了多少工作并不是一个坏主意。好处是您可以实际控制何时发生更新并可以平衡负载。

缺点是信息可能很快就会过时,您可能永远无法获得准确的结果,因为当您读取这些值时,爬虫可能已经更改了它们。

您可以让爬虫提供一个回调接口,GUI 注册到该接口,当爬虫更新它的状态时,回调到 GUI。

这里的问题是 UI 可能会被结果淹没,导致在试图跟上时出现滞后。同样,当爬虫发出这些通知时,它并没有做它的工作......

(假设摇摆)

无论哪种情况,您都需要确保您对 UI 所做的任何想法都是在事件调度线程中产生的。这意味着如果您使用回调方法,返回的更新将来自爬虫线程上下文。您需要将这些与 EDT 重新同步。

在这种情况下,您可以简单地使用 aSwingWorker它为您提供将更新同步回 EDT 的机制。

查看Swing 中的并发以获取更多详细信息

于 2013-07-12T08:13:56.213 回答
0

向您的线程注册一个回调函数。当你的数据变脏时,调用这个回调函数来通知 GUI 线程更新。不要忘记使用同步。

于 2013-07-12T08:18:13.677 回答