繁体   English   中英

eli5秋千工人和秋千线

[英]eli5 swing worker and swing thread

我有一个程序,可以从这里得到一些帮助( 如何使我的程序每小时检查一次股市价值[java] ),从那时起,我一直在阅读有关摇摆工的信息。 我仍未解决该程序,因为我已经3次重读了官方文档,但我仍然有些困惑。 我认为这是我的理解,如果我做错了,请纠正我。

您在有较长的后台进程时使用SwingWorker,并将SwingWorker放在要执行的操作中吗? 一旦创建了过程(如果希望它更新GUI),就会使其返回一个值,然后从SwingWorker done()方法中获取(该值)。 我对在哪里初始化SwingWorker感到困惑,因为我想说它执行的动作,但是那不就是SwingInvokeLater涉及的地方吗? 如果是这样,那么两者之间有什么区别。 我相信SwingInvokeLater和done()都可以通过在EDT上运行来更新GUI。

仅仅写完所有内容我就迷失了方向,我觉得自己越来越接近理解,但是由于某种原因它不会点击。 我不喜欢官方文档提供的示例,我想我只是看不到整个图片。 官方文档说要在SwingInvokeLater中初始化您的GUI,但我不理解这与在main()中初始化我的GUI之间的区别。

您的问题/我的答复:

您在有较长的后台进程时使用SwingWorker,并将SwingWorker放在要执行的操作中吗?

它可以放在ActionListener中,是的。 您可以创建它并在需要的地方执行它,而且不多也不少。

一旦创建了过程(如果希望它更新GUI),就会使其返回一个值,然后从SwingWorker done()方法中获取(该值)。

这是更新GUI的一种方法。 您还可以使用发布/处理方法对来使用临时结果更新GUI。 您还可以使用附加到SwingWorker的PropertyChangeListener来更新GUI。 无论如何,即使没有返回任何内容,通常最好在某个地方调用get() ,因为这将使您的Swing GUI知道在SwingWorker运行期间可能引发的任何异常。

我对在哪里初始化SwingWorker感到困惑,因为我想说它执行的动作,但是那不就是SwingInvokeLater涉及的地方吗?

SwingUtilities.invokeLater(...)用于将代码排队到Swing事件线程EDT上。 在ActionListener中,这不是必需的,因为它的代码已经在Swing事件线程上被调用。

如果是这样,那么两者之间有什么区别。

他们是完全不同的。 同样, invokeLater(...)用于在事件线程上调用代码,而SwingWorker用于从事件线程上调用长时间运行的代码。

我相信SwingInvokeLater和done()都可以通过在EDT上运行来更新GUI。

是的,他们俩都可以。

官方文档说要在SwingInvokeLater中初始化您的GUI,但我不理解这与在main()中初始化我的GUI之间的区别。

通过使用SwingUtilities.invokeLater(...)您可以确保传递给它的代码在EDT(事件调度线程)上运行。 如果您不这样做,就没有保证。 尽管许多Swing程序大部分时间都将在不执行此操作的情况下运行,但如果不采取这种措施,它们有时(并且确实)有时会失败。


编辑

所以我想我朝着正确的方向前进。 如果我有一个每小时检查一次网站价值的进程,由于它的过程很短(需要一秒钟),使用invokeLater()会更好吗?

您可以为此使用某种类型的计时器,可能是ScheduledExecutorService,它可能在Swing的后台运行,也许与SwingWorker一起运行。 然后,该过程将称为Swing线程的后台,并且您可以通过发布/过程来更新GUI。

整个代码块都放在invokeLater内部还是只是更新GUI部分。 我觉得整个代码应该放在invokeLater内部,但是有人告诉我只是为了更新GUI,例如invokeLater()内部的(text.setText())。

如前所述,您的GUI需要在Runnable内部启动,该Runnable传递到对invokeLater(...)的调用中。 至于您的程序正在运行时,如果使用SwingWorker运行后台代码,则通常无需调用invokeLater(...) 这是使用SwingWorker而不是普通的香草线程的原因之一。


编辑2
您声明:

我在测试时碰到的最后一个问题..在执行的动作中,我使buttonclick更改了文本字段说“嗨”,然后为Thread.sleep(1000)放入了一个try catch,然后将文本字段说了“ ho”。 结果怎么只输出ho? 它没有显示嗨,我用数字测试过,可以看到程序被锁定。 我知道使用线程可以解决此问题,但是只是想知道为什么如果我入睡了,为什么它不会显示输出。

当您调用Thread.sleep(...) ,会将调用线程(这里是Swing Event Dispatch Thread或EDT)置于睡眠状态。 由于它负责所有Swing绘画和用户交互,因此整个应用程序进入睡眠状态,并且GUI在睡眠完成之前无法执行任何更新。 这就是为什么必须使用后台线程执行此类操作的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM