首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >eli5 swing工作线程和swing线程

eli5 swing工作线程和swing线程
EN

Stack Overflow用户
提问于 2013-11-28 17:47:44
回答 1查看 126关注 0票数 1

我有一个程序,我从这里得到了一些帮助(how do I make my program check the stock market value every hour[java]),从那时起,我就一直在阅读关于swing员工的文章。我仍然没有修正程序,因为我重新读了3次官方文档,我仍然有点困惑。以下是我认为我理解的东西,如果我错了,请纠正我。

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

我觉得我迷失了,只是写出来,我觉得我越来越接近理解,但由于某些原因,它只是不会点击。我不喜欢官方医生提供的例子,我想我只是看不出整个情况。官方文档说要在SwingInvokeLater中初始化GUI,但我不明白这与仅仅在main()中初始化GUI之间的区别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-28 17:54:38

你的问题/我的答复:

当您有一个长的后台进程时,您使用SwingWorker,并将SwingWorker放入您执行的操作中?

它可以进入一个ActionListener,是的。您创建它并在需要的地方执行它,不多,也不少。

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

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

我对初始化SwingWorker感到困惑,因为我想说它是执行的操作,但这不是涉及SwingInvokeLater的地方吗?

SwingUtilities.invokeLater(...)用于将代码排队到Swing事件线程( EDT )上。这在ActionListener内部没有必要,因为它的代码已经在Swing事件线程上调用了。

如果是这样的话,两者之间有什么区别呢?

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

我相信SwingInvokeLater和on ()都是通过在EDT上运行来更新GUI的。

是的他们都可以。

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

通过使用SwingUtilities.invokeLater(...),您可以确保传递给它的代码在EDT (事件调度线程)上运行。如果你不这么做,你就没有这个保证。虽然许多Swing程序大部分时间都不会运行,但如果不小心的话,它们可能(而且确实)会失败。

编辑

所以我想我正朝着正确的方向前进。如果我有一个在网站上每小时检查一个值的进程,因为这是一个很短的过程(耗时一秒钟),那么使用invokeLater()会更好吗?

为此您可以使用某种类型的计时器,可能是在Swing背景下运行的ScheduledExecutorService,可能是SwingWorker。然后,进程将被称为Swing线程的后台,您可以通过发布/处理更新GUI。

整个代码块是在invokeLater内部,还是只在更新GUI部分。我觉得整个代码应该放在invokeLater中,但是有人告诉我只需要更新GUI,比如(text.setText())在invokeLater()中。

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

编辑2

你说:

最后一个问题是,当testing..inside执行一个操作时,我让按钮单击change来打个招呼,然后为Thread.sleep(1000)输入一个try catch,然后更改textfield以表示ho。为什么结果只输出ho?它没有显示嗨,我用数字测试,可以看到程序锁定。我知道使用线程会修复这个问题,但我只是想知道,如果我睡觉,它为什么不会显示输出。

当您调用Thread.sleep(...)时,您将调用线程(这里是Swing事件调度线程或EDT )置于休眠状态。由于它负责所有Swing绘图和用户交互,整个应用程序将进入休眠状态,GUI在睡眠完成之前无法执行任何更新。这正是为什么您必须使用后台线程来执行这种事情的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20272120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档