我已经构建了一个连接到数据库的桌面应用程序,功能是添加-删除-修改。我把它与3个JInternalFrame分开。
现在的问题是,当我执行批量更新以更新>500个订单时,我的应用程序将挂起,但它正在处理请求。然后我会再次运行这个应用程序,所以现在我用同一个应用程序打开了两个窗口。第一次申请完成后,我可以再次使用以前的申请。
现在我的问题是,如何在我的应用程序中实现线程,以便在同一个窗口应用程序中运行尽可能多的函数?
长时间运行的任务(如批量更新)不能在事件调度线程(进行所有GUI操作的线程)中完成,否则,正如您所观察到的,GUI会冻结。
使用SwingWorker在后台线程中执行长时间运行的任务。它的javadoc有一个有用的例子,它也在Swing教程中进行了描述。
java中的多线程现在非常简单,添加了[java.util.concurrent.][1]
你需要做的是
- 将500份工作订单分成更小的批次,比如说每批次10份。
- 创建一个具有已配置线程数的线程池,例如10个线程
- 创建一个可运行/可调用任务,该任务将从公共位置提取这些批,并对数据库执行CRUD操作
- 您还需要一个通用的数据结构,该结构将具有这些CRUD操作的结果。因此,一旦可运行/可调用任务完成其操作,它就会使用操作结果更新此数据结构
- 还要记住,对这些数据结构的访问-保存一批工单的-保存运算结果的应该同步
对于线程池,您可以使用
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()函数中的所有内容。