Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程管理和应用程序流_Java_Multithreading_Swing - Fatal编程技术网

Java线程管理和应用程序流

Java线程管理和应用程序流,java,multithreading,swing,Java,Multithreading,Swing,我有一个从服务器下载信息(实体)的Java应用程序。我使用下载线程来下载数据 下载流程如下所示: 登录-下载用户实体 根据用户实体,下载“社区”实体列表并显示在下拉列表中 根据社区下拉选择,下载并在JTree中显示“组织树” 根据节点选择,下载类别实体并显示在下拉列表中 根据类别选择,下载子类别实体并显示在下拉列表中 根据子类别选择下载一个大数据集并保存它 下载发生在线程中,因此GUI不会“冻结”。它还允许我更新进度条 我需要帮助来管理这个过程。主要的问题是,当我下载实体数据时,我必须找到一种方

我有一个从服务器下载信息(实体)的Java应用程序。我使用下载线程来下载数据

下载流程如下所示:

  • 登录-下载用户实体
  • 根据用户实体,下载“社区”实体列表并显示在下拉列表中
  • 根据社区下拉选择,下载并在JTree中显示“组织树”
  • 根据节点选择,下载类别实体并显示在下拉列表中
  • 根据类别选择,下载子类别实体并显示在下拉列表中
  • 根据子类别选择下载一个大数据集并保存它
  • 下载发生在线程中,因此GUI不会“冻结”。它还允许我更新进度条

    我需要帮助来管理这个过程。主要的问题是,当我下载实体数据时,我必须找到一种方法等待线程完成,然后再尝试获取实体并进入应用程序流中的下一步

    到目前为止,我使用了一个模态对话框来控制流。我启动线程,弹出一个模态,然后在线程完成后处理该模态。模态/线程是观察者/可观察者。线程在完成并处理对话框时进行了一组更改。显示模式可以有效地停止应用程序的流程,以便它可以等待下载完成

    我还试着把所有的工作流程转移给观察者。过程中的所有相关GUI都是观察者。每个更新方法都会等待下载完成,然后调用下一个GUI,该GUI自行下载

    到目前为止,我发现这两种方法产生的代码很难理解。我想“集中”这个工作流程,这样其他开发人员在尝试遵循它时就不会拔掉他们的头发

    我的问题是:您是否有任何建议/示例,可以通过生成易于遵循的代码的方式来管理这样的工作流

    我知道“容易”是一个相对的术语,我知道我的两个选择都已经起作用了,但我想从其他程序员那里得到一些想法,同时我还有时间改变它


    非常感谢。

    您可能需要研究如何使用
    未来的
    界面。
    顺便走访
    它包含了使这些任务变得更容易所需的所有内容。

    您必须为视图创建一个“模型”,表示应用程序的当前状态。对于树,例如,当有人打开树节点时,显示“加载”节点是合理的,因为其他情况下GUI会挂起打开节点

    如果加载线程完成加载节点,“加载”-节点将替换为异步操作的结果。这使得并行打开多个节点变得容易,因为工作线程都只负责一个子节点

    下载内容时类似:工作人员随后更新下载进度。这里出现了Firefox的下载对话框


    好的GUI并不容易:)

    我认为在Java的最新版本中,最常用的方法是使用SwingWorker:

    它允许您启动后台任务,并为您提供一个方便的done()方法,该方法在Swing EDT上执行