2012-01-19 28 views
1

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

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

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

回答

0

看看Swing Threads

特别是在:

SwingUtilities.invokeLater() 
0

我只是用:

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

或者,如果你想经常使用,可以使一个实现Runnable接口的类,所以你不必重写一切都在run()函数中。

1

多线程Java中现在是很简单的通过添加[java.util.concurrent.][1]

你需要做的是

  1. 分裂500个工作订单为较小的批次,说10每批次。
    1. 创建一个带有配置线程数的线程池,比如10个线程。
    2. 创建一个可运行/可调用任务将从一个共同的地方拿起这些批处理并对数据库执行CRUD操作。
    3. 您还需要一个通用的数据结构,它将具有这些CRUD操作的结果。所以一旦Runnable接口/调用任务完成它的操作,更新与操作的结果这个数据结构
    4. 还要记住的是,获得这些数据结构 - 保存批处理作业的一个订单 - 应保持操作结果 的同步。

对于线程池可以使用的

Executors.newFixedThreadPool or Executors.newCachedThreadPool() 
0

一个你应该做的是从你的数据库访问和修改类独立的UI类。然后,您可以从您的用户界面,你可以调用像这样:但是

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

注意,即具有在同一时间去了很多数据库操作可能导致错误特别是因为数据库可能会锁定表到它正在阅读/写入。我建议你一次只保留一个操作,并使用线程来显示选取框进度条或类似的东西。

+0

嗨npinti,感谢您的回复,我想我会去JB Nizet建议,因为当我读到关于摆动并发,我觉得我没有履行这一规则。因此,当我执行长时间任务时,我的应用程序被冻结。 – lagunaloire

2

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

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

+0

Hi HB Nizet,感谢您的建议。读完教程后,如何制作初始线程,事件分派线程或工作线程? – lagunaloire

+1

如果您还没有从教程中了解这一点,请重新阅读它。初始线程是执行主方法的主线程。 EDT是调用SwingUtilities.invokeLater(...)从主方法创建并显示GUI时自动创建的线程。工作线程是SwingWorker为您创建的工作线程。仔细阅读** **。 –

+0

是的,你说我没有仔细阅读它......好吧,让我更多地挖掘它。 – lagunaloire

相关问题