Java 在GUI中显示另一个线程的状态

Java 在GUI中显示另一个线程的状态,java,user-interface,Java,User Interface,我有一个GUI,GUI正在启动另一个线程(Java)。此线程正在启动一个类,该类正在对许多网站进行爬网。现在我想在GUI中显示有多少网站被爬网,还有多少网站被留下。 我想知道最好的解决办法是什么 第一个想法是在GUI中启动计时器,定期询问爬虫还剩多少。但我想这是相当肮脏的 然后可以将GUI传递给爬虫程序,每当就绪网站的数量发生变化时,爬虫程序就会调用GUI方法。但我不认为这更好吗 做那样的事情最好的方法是什么?视情况而定 询问爬虫它完成了多少工作不是个坏主意。好处是您可以实际控制更新发生的时间,

我有一个GUI,GUI正在启动另一个线程(Java)。此线程正在启动一个类,该类正在对许多网站进行爬网。现在我想在GUI中显示有多少网站被爬网,还有多少网站被留下。 我想知道最好的解决办法是什么

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

然后可以将GUI传递给爬虫程序,每当就绪网站的数量发生变化时,爬虫程序就会调用GUI方法。但我不认为这更好吗

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

视情况而定

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

缺点是,信息可能会很快过时,您可能永远不会得到准确的结果,因为在您读取这些值时,爬虫程序可能已经更改了它们

您可以让爬虫程序提供回调接口,GUI向其注册,当爬虫程序更新其状态时,会回调GUI

这里的问题是,UI可能会被结果淹没,导致它在试图跟上时出现延迟。同样,当爬虫程序触发这些通知时,它并没有完成它的工作

(假设摆动)

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

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


查看以了解更多详细信息

向线程注册回调函数。当数据变脏时,调用此回调函数通知GUI线程进行更新。不要忘记使用同步。

只允许GUI线程调用GUI方法。你不能将它传递给另一个线程。@ErikEkman好吧,从技术上讲你可以,但是如果有大量的
invokeLater
s,它就会变得很混乱。最好使用
SwingWorker
:P-还有一个责任问题-谁实际负责更新UI-答案是你和我会提出这个GUI类,爬虫是,一个爬虫,让它爬行:如果使用Swing,不要忘记确保对UI的所有更新都在EDT的上下文中执行