【问题标题】:Starting Thread after GUI constructionGUI构建后启动线程
【发布时间】:2011-07-13 20:32:05
【问题描述】:

我有一个在构造函数中构建 GUI 的程序。我需要一个与 EDT 分开的线程,以便在构造相关对象后立即运行。谁能指出我正确的方向?

【问题讨论】:

  • “紧接着”是指这个过程应该是连续的吗?
  • 你希望线程如何与 GUI 交互?还是独立的?
  • 需要修改JTable中的数据。有问题的线程通过 非常 慢速协议打开网络连接,因此需要显示 GUI,然后线程需要顺序修改条目作为来自网络的数据流。所以本质上:这个过程应该是连续的。

标签: java multithreading swing user-interface


【解决方案1】:

我需要一个独立于 EDT 的线程

线程与 EDT 是分开的,所以您只需创建一个 Runnable 然后启动它。

您只需要担心线程是否更新了任何 GUI 组件。如果是这种情况,那么您可能需要使用 SwingWorker。阅读 Concurrency 上的 Swing 教程部分了解更多信息。

【讨论】:

    【解决方案2】:

    您要使用的是SwingWorker。在doInBackground 方法中,打开连接并开始获取数据。当您有足够的数据来更新 gui 时,调用 publish 方法。实现process 方法以使用来自publish 的新数据更新gui,最后,实现done 方法以在您完成获取数据时通知用户。

    Swing Worker 是泛型的,因此在构造它时需要提供两种类型:TVV 是在 publishprocess 方法之间传递的数据的类型,TdoInBackground 返回并传递给 done 的类型。

    【讨论】:

      【解决方案3】:

      构建你的 GUI 并在一个新的 Runnable 中打开一个新窗口,调用者为:SwingUtilities.invokeLater

      【讨论】:

        【解决方案4】:

        你有两个选择

        1) 将 Thread 包装到 Runnable 中,如 here 所示

        2)我对普通的 SwingExecutor 不是很满意,然后我用那个 Executor 和 SwingWorker,由 PropertyChangeListener 监控,例如here

        请谨慎使用 Executor 启动的线程数。 Executor 不在乎 SwingWorker 是否结束,并且仍然存在Bug,其中很可能会在同一时间由 Executor 重载最大(在 API 中的某个位置)同时工作。

        因此有可能实现 PropertyChangeListener

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-26
          • 1970-01-01
          • 2013-05-31
          • 1970-01-01
          相关资源
          最近更新 更多