Java 如何为我的自制桌面应用程序实现线程

Java 如何为我的自制桌面应用程序实现线程,java,multithreading,desktop-application,Java,Multithreading,Desktop Application,我已经建立了一个桌面应用程序,连接到数据库,功能是添加删除修改。我把它分为三个部分 现在的问题是,当我执行批量更新以更新>500个订单时,我的应用程序将挂起,但它正在处理请求。然后我会再次运行这个应用程序,所以现在我有两个窗口打开了相同的应用程序。第一次申请完成后,我可以再次使用以前的申请 现在我的问题是,如何在我的应用程序中实现线程,以便在同一个窗口应用程序中运行尽可能多的函数?看一看 特别是在: SwingUtilities.invokeLater() 我只想用: new Thread(n

我已经建立了一个桌面应用程序,连接到数据库,功能是添加删除修改。我把它分为三个部分

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

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

看一看

特别是在:

SwingUtilities.invokeLater()
我只想用:

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

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

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

你需要做的是

  • 将500份工作订单分成更小的批次,比如说每批次10份。
  • 创建一个线程池,其中包含配置数量的线程,例如10个线程
  • 创建一个可运行/可调用的任务,该任务将从一个公共位置拾取这些批,并在数据库上执行CRUD操作
  • 此外,您还需要一个通用数据结构,该结构将具有这些CRUD操作的结果。因此,一旦可运行/可调用任务完成其操作,它就会用操作的结果更新此数据结构
  • 还要记住,对这些数据结构的访问 -保存该批作业订单的一个 -保存操作结果的那个 应该同步
  • 对于线程池,您可以使用

    Executors.newFixedThreadPool or Executors.newCachedThreadPool()
    

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

    new Thread(new Runnable()
    {
        public void run()
        {
            //Call database stuff here
        }
    }).start();
    
    但是请注意,同时进行大量数据库操作可能会导致错误,特别是因为数据库可能会锁定当前正在读取/写入的表。我建议您一次只执行一个操作,并使用线程来显示字幕进度条或类似的内容

    长时间运行的任务(如批量更新)不能在事件调度线程(执行所有GUI操作的线程)中完成,否则,正如您所观察到的,GUI会冻结


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

    Hi HB Nizet中描述过,谢谢你的建议。在我阅读了教程之后,如何创建初始线程、事件调度线程或工作线程?如果您还没有从教程中理解这一点,请重新阅读。初始线程是执行main方法的主线程。EDT是在调用SwingUtilities.invokeLater(…)以从主方法创建和显示GUI时自动创建的线程。工作线程是SwingWorker为您创建的线程。是的,你知道,我没有仔细读。。。好的,让我再挖一点。嗯。。。试图实现我的代码,但在任何地方都出现了错误:SJB Nizet,如果您有SwingWorker的“良好阅读”示例,您愿意与我分享吗?嗨,npinti,感谢您的回复,我想我会去JB Nizet建议,因为当我读到swing中的并发性时,我认为我没有实现该规则。因此,当我执行长任务时,我的应用程序被冻结