【问题标题】:How to implement a thread to my home-made desktop application如何为我的自制桌面应用程序实现线程
【发布时间】:2012-01-19 10:13:13
【问题描述】:

我已经建立了一个连接到数据库的桌面应用程序,功能是添加-删除-修改。我将它与 3 JInternalFrame 分开。

现在的问题是,当我执行批量更新以更新 >500 个订单时,我的应用程序将挂起,但它正在处理请求。然后我将再次运行这个应用程序,所以现在我打开了 2 个使用相同应用程序的窗口。第一次申请完成后,我可以再次使用之前的申请。

现在我的问题是,如何在我的应用程序中实现线程,以便我可以在同一个窗口应用程序中运行尽可能多的功能?

【问题讨论】:

    标签: java multithreading desktop-application


    【解决方案1】:

    长时间运行的任务(如批量更新)不得在事件调度线程(进行所有 GUI 操作的线程)中完成,否则,如您所见,GUI 会冻结。

    使用 SwingWorker 在后台线程中执行长时间运行的任务。它的 javadoc 有一个有用的例子,在Swing tutorial 中也有描述。

    【讨论】:

    • 您好 HB Nizet,感谢您的建议。看完教程,如何制作Initial线程、事件派发线程或Worker线程?
    • 如果您还没有从教程中理解这一点,请重新阅读。初始线程是主线程,它执行您的 main 方法。 EDT 是当您调用 SwingUtilities.invokeLater(...) 以从 main 方法创建和显示您的 GUI 时自动创建的线程。工作线程是 SwingWorker 为您创建的线程。 仔细阅读
    • 是的,你说我没有仔细阅读它...好吧,让我再挖掘一下。
    • hmm... 试图实现我的代码,但到处都出错:S
    • JB Nizet,如果你有 SwingWorker 的“好读”示例,你会与我分享吗?
    【解决方案2】:

    加上[java.util.concurrent.][1],现在java中的多线程非常简单

    你需要做的是

    1. 将 500 个作业订单分成更小的批次,例如每批次 10 个。
      1. 使用配置的线程数(例如 10 个线程)创建一个线程池。
      2. 创建一个 Runnable/callable 任务,该任务将从一个公共位置提取这些批次并在数据库上执行 CRUD 操作。
      3. 您还需要一个通用数据结构,该结构将包含这些 CRUD 操作的结果。所以一旦 Runnable/callable 任务完成它的操作,它会用操作的结果更新这个数据结构
      4. 还要记住对这些数据结构的访问 - 持有一批工作订单的那个 - 持有运算结果的那个 应该同步。

    对于线程池,您可以使用其中一种

    Executors.newFixedThreadPool or Executors.newCachedThreadPool()
    

    【讨论】:

      【解决方案3】:

      看看Swing Threads

      特别是在:

      SwingUtilities.invokeLater()
      

      【讨论】:

        【解决方案4】:

        您应该做的是将您的 UI 类与数据库访问和修改类分开。然后,您可以从您的 UI 中调用如下内容:

        new Thread(new Runnable()
        {
            public void run()
            {
                //Call database stuff here
            }
        }).start();
        

        但是请注意,同时进行大量数据库操作可能会导致错误,尤其是因为数据库可能会锁定它当前正在读取/写入的表。我建议您一次只进行一项操作,并使用线程来显示选框进度条或类似的东西。

        【讨论】:

        • 您好,npinti,感谢您的回复,我想我会去 JB Nizet 的建议,因为当我读到关于 Swing 中的并发时,我认为我没有满足该规则。因此,当我执行长任务时,我的应用程序会冻结
        【解决方案5】:

        我只是使用:

        new Thread(new Runnable()
        {
            public void run()
            {
                //Things to do in new thread...
            }
        }).start();
        

        或者如果你想经常使用它,你可以制作实现 Runnable 的类,这样你就不必重写 run() 函数中的所有内容。

        【讨论】:

          猜你喜欢
          • 2011-06-05
          • 2012-07-29
          • 2011-07-02
          • 2019-06-14
          • 1970-01-01
          • 2011-07-29
          • 1970-01-01
          • 2020-04-04
          • 1970-01-01
          相关资源
          最近更新 更多