识别用于在Java中显示频繁数据输入的Swing线程

识别用于在Java中显示频繁数据输入的Swing线程,java,multithreading,swing,Java,Multithreading,Swing,对于我当前的应用程序,我正在努力识别应用程序中的Swing线程。对于Swing线程,我的意思是: 初始线程 事件调度线程 工作线程 我的申请: 简单的用户界面,用于显示在套接字上接收到的数据 数据由许多模型类描述 接收到的数据是XML,XML被解析,模型对象被实例化 用户界面应该显示接收到的数据 这些数据更新得非常频繁,这意味着XML消息很短,但其中有很多 把它放到上下文中:我正在编写一个Java分析器 到目前为止,我已经阅读了Swing教程,以下是我的猜测和问题: 后台任务是服务器套接

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

  • 初始线程
  • 事件调度线程
  • 工作线程
我的申请:

  • 简单的用户界面,用于显示在套接字上接收到的数据
  • 数据由许多模型类描述
  • 接收到的数据是XML,XML被解析,模型对象被实例化
  • 用户界面应该显示接收到的数据
  • 这些数据更新得非常频繁,这意味着XML消息很短,但其中有很多
  • 把它放到上下文中:我正在编写一个Java分析器
到目前为止,我已经阅读了Swing教程,以下是我的猜测和问题:

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

  • 任务没有最终结果,因此我想
    SwingWorker
    应该只为中间结果定义泛型类型?对于每个解析的XML,我都会调用
    publish
    。但我如何区分我收到的数据呢?可能XML数据只包含足够的信息来构建
    a类
    ,或者可能数据包含足够的信息来构建
    a类
    B类
    ,但是如何将这两种信息包装成一个临时结果?包装类

  • process()
    方法调用更改以使其对用户界面可见,不是吗?我不明白这是怎么回事。我在哪里启动任务?调用
    JFrame
    构造函数中的
    SwingWorker.execute()
    是为了实现这一点吗

  • XML读取器是任务还是处理传入连接的每个线程都是任务


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

    我的基本想法是:

    • 从您的
      main()
      中,启动几个用于服务套接字的线程(标准
      Thread
      API)
    • 当一个这样的套接字线程获得一些输入时,它会立即解析XML(正如您所描述的,解析应该非常快,因此我认为您不需要为此启动一个新线程)
    • 解析XML后,套接字线程创建一些要显示的“结果对象”,在
      final
      变量中声明此对象,并调用
      SwingUtilities.invokeLater()
      在UI中显示此结果
    我过去成功使用的另一个替代方法是使用EventBus,它负责调用EDT中的UI更新方法,套接字线程将“结果对象”发送到该EventBus


    关于
    SwingWorker
    use,我想说的是,主要用途是当最终用户启动一个动作(例如,单击按钮或菜单项)时,这个动作很长,应该在后台处理,后台处理方法必须将信息反馈给UI。

    非常好,这看起来像是我一直在寻找的解决方案。然而,我看不出invokeLater和使用EventBus之间有什么区别。使用EventBus可以避免声明和传递内联Runnable,因为只有内联Runnable函数才能调用UI上的更新方法。在我看来,这个设计有点简洁。JavaSwing是否提供了EventBus接口?我找不到任何文档,或者它是一个可以用于我的事业的架构吗?不,你必须使用第三方库。Swing应用程序中最常用的是。还有guts event(),我自己的项目,但它要求您在应用程序中使用Guice依赖项注入库,这对于您正在开发的应用程序来说可能有点过火(或者没有)。两者都是开源的。