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



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

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

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

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

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

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

你需要做的是

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

对于线程池,您可以使用

Executors.newFixedThreadPool or Executors.newCachedThreadPool()

看看Swing Threads。

特别是在:

SwingUtilities.invokeLater()

您应该做的是将UI类与数据库访问和修改类分离。然后,你可以从你的UI中调用这样的东西:

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

然而,请注意,同时进行大量数据库操作可能会导致错误,尤其是因为数据库可能会锁定当前正在读/写的表。我建议您一次只执行一个操作,并使用线程显示大框进度条或类似内容。

我只想使用:

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

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

最新更新