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

时间:2012-01-19 10:13:13

标签: java multithreading desktop-application

我已经构建了一个连接数据库的桌面应用程序,该功能是add-delete-modify。我把它分成3个JInternalFrame。

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

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

现在,通过添加[java.util.concurrent.][1]

,Java中的多线程非常简单

您需要做的是

  1. 将500个工单分成较小的批次,每批10个。
    1. 创建一个带有已配置线程数的线程池,比如10个线程。
    2. 创建 Runnable / callable 任务,该任务将从公共位置获取这些批次并在数据库上执行CRUD操作。
    3. 您还需要一个公共数据结构,它将具有这些CRUD操作的结果。因此,一旦 Runnable / callable任务 完成它的操作,它就会使用操作结果更新此数据结构
    4. 还要记住访问这些数据结构               - 持有一批工单的人               - 保存操作结果的那个 应该同步。
  2. 对于线程池,您可以使用其中一个

    Executors.newFixedThreadPool or Executors.newCachedThreadPool()
    

答案 2 :(得分:0)

看看Swing Threads

特别是在:

SwingUtilities.invokeLater()

答案 3 :(得分:0)

我只是使用:

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

或者如果你想经常使用它,你可以创建实现Runnable的类,所以你不必重写run()函数中的所有东西。

答案 4 :(得分:0)

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

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

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