Swing/SwingWorker新手问题

3
我正在尝试在Java中实现GUI,但我是Swing的初学者。我想要澄清一些事情。我读到为了保持GUI的响应性,我应该使用SwingWorker类在单独的线程中执行任务。到目前为止还好。
现在,我的模型有大约15个远程方法。每个方法返回的结果类型都不同于其他方法。
在我的视图中,用户按下一个按钮,然后调用模型中的适当方法。如果不使用SwingWorker,GUI会冻结。我的问题是,我是否应该创建15个SwingWorker线程的子类,并根据用户的操作需要创建每个线程的新实例?我的理解正确吗?是否有标准的方法来处理这个问题,或者我说的方法是正确的?
谢谢!
2个回答

2
请看这个链接:简单的后台任务
看起来您有两个问题。首先,关于在使用SwingWorker时所需的代码量:确实需要为每个操作创建一个SwingWorker子类,但这并不意味着它们需要是顶级命名类或位于自己的文件中。它们可以是匿名类,如文章所示,因此代码位于GUI的事件处理代码中。
其次,关于实例化SwingWorker对象:您无法重用SwingWorker,但由于作业是作为用户活动(例如点击按钮)的结果执行的,因此每次实例化新对象时不应遇到任何性能问题。

谢谢。使用匿名类或子类之间是否会有性能差异? - Cratylus
我有所怀疑。匿名内部类的实例引用了封闭类的实例(即占用更多内存)。您可以改用静态嵌套类,但是然后您需要传递一些引用到您的GUI,以便在作业完成后更新GUI。(如果您想了解有关内部与静态嵌套类的信息,请参见此处:http://blogs.sun.com/darcy/entry/nested_inner_member_and_top) - Richard Fearn

0

毫无疑问,SwingWorkers可以完成工作。但在我的经验中,我不喜欢仅为一个小任务使用SwingWorkers。我更喜欢生成一个线程,并让该线程请求EventDispatch线程更新GUI。只有EventDispatch线程应该更新UI,尽管有一些例外。

我建议阅读Swing中的线程相关内容。

虽然线程可能会变得繁重,也许这种解决方案并不适用于所有情况,但如果需要单独的线程来引发GUI的变化,请使用类似以下的东西:

java.awt.EventQueue.invokeLater(new Runnable() 
{ 

    public void run() 
    { 
        // this codes runs on the event dispatch thread 
        // update the ui here.
    } 
}); 

由于我们无法将它们池化,因此每次与 GUI 交互时都会创建一个新线程(您描述的方式)。那么不断产生新线程会不会有任何开销呢? - Cratylus
线程应该谨慎使用。总会有一些开销。我认为在某些情况下,后台线程是合理的。 - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接