识别Swing Threads以在Java中显示频繁的数据输入

时间:2011-04-08 09:34:44

标签: java multithreading swing

对于我当前的应用程序,我正在努力识别我的应用程序中的Swing线程。使用Swing线程我的意思是:

  • 初始线程
  • 事件派发线程
  • 工作线程

我的申请:

  • 应该显示在套接字上收到的数据的简单用户界面
  • 数据由许多模型类描述
  • 接收的数据是XML,它被解析并且模型对象被实例化
  • 用户界面应显示收到的数据
  • 这些数据经常更新,这意味着XML消息很短,但有很多
  • 将其置于上下文中:我正在编写Java分析器。

到目前为止,我已阅读过Swing教程,所以这是我的猜测和问题:

后台任务是服务器套接字,后台任务分别是应用程序接收数据的已打开连接数。

  1. 这些任务没有最终结果,所以我想SwingWorker<T,S>应该只定义中间结果的通用类型?对于每个解析的XML,我都会调用publish。但是,我如何区分我收到的数据?也许XML数据只包含足够的信息来构建class A,或者数据包含足够的信息来构建class Aclass B,但是如何将两者都包含在一个中间结果中呢?包装类?

  2. process()方法调用更改以使其对用户界面可见,不是吗?我不知道这是如何工作的。我在哪里开始我的任务?是为了调用SwingWorker.execute()构造函数中的JFrame吗?

  3. XML Reader应该是Task还是应该处理传入连接的每个Thread都是任务?

1 个答案:

答案 0 :(得分:2)

在您描述的上下文中,我不确定是否会使用SwingWorker

我的基本想法是:

    来自main()
  • ,启动多个服务套接字的线程(标准Thread API)
  • 当一个这样的套接字线程得到一些输入时,它立即解析XML(正如你所描述的那样,解析应该非常快,因此我认为你不需要为此开始一个新线程)
  • 解析XML后,套接字线程会创建一些要显示的“结果对象”,在final变量中声明此对象,并调用SwingUtilities.invokeLater()进行显示这个结果在你的UI中

我过去成功使用的另一种替代方法是使用 EventBus 来处理在EDT中调用UI更新方法,您的套接字线程会将“结果对象”发送到那个EventBus。

关于SwingWorker使用,我想说主要用途是当最终用户开始动作时(例如通过点击按钮或菜单项)并且此动作很长并且应该在后台处理,背景然后,处理方法必须将信息反馈给用户界面。