我用什么类来扩展SwingWorker?

时间:2012-08-08 00:31:58

标签: java multithreading swing swingworker

我有一个Java Swing应用程序。我想将信息上传到Web端点,并且该过程将花费足够的时间来证明将工作分解到另一个线程。我想使用Swing SwingWorker范例来做到这一点。我对扩展SwingWorker的位置感到困惑。

现在我为每个Web端点都有一个类,该类存储了发往该端点的所有数据,以及与端点接口所需的代码(位于名为upload()的方法下)。这些类是否应该实现SwingWorker,因为它需要执行任务的所有数据?或者我应该有一个辅助类FooWorker实现SwingWorker,它将从内部Site对象调用Upload()?

如果我创建了一个辅助FooWorker类,那么我似乎不得不将对站点的引用填充到我实例化的每个FooWorker对象(每个Web端点的一个线程/工作者),但该站点不会受到一堆SwingWorker方法和代码的污染。

如果我使用Site类扩展SwingWorker,那么我可以直接从EDT为每个站点调用.execute(),这对我来说比为每个站点创建一个worker更加清洁,然后让那个worker调用上传()关闭网站。

只是寻找关于哪种方法更好的意见和想法。 Site类已经相当复杂,如果扩展SwingWorker类,我害怕将一堆域无关的东西放入其中。但是,如果我走这条路线,FooWorker类基本上只是Site类的一个薄包装器。该包装器是否值得保持Site类仅关注其自己的域方法/数据?

1 个答案:

答案 0 :(得分:2)

在有意义的地方引入抽象总是一个好主意。在这种情况下,我认为它是有道理的,因为你最终可能会创建几个SwingWorker类。

您可以考虑创建一个名为SiteWorker的SwingWorker类。然后,我创建Site接口,实现方法upload()。表示与站点端点的连接的每个类都将实现此站点接口。然后,您可以让SiteWorker处理Site接口,而不必处理实现SwingWorker的所有不同类型的Site类。

请记住,编程接口而不是实现。如果您只需创建一个SiteWorker,然后专注于各种站点实现,那么它将使您的生活更轻松。

因此,您可以将Site实例(可以是任何实现Site的类)作为参数传递给SiteWorker类,然后在其doInBackground()方法中调用实现Site的实例的upload()方法