模拟长时间运行操作

3
我该如何模拟一个长时间运行的数据库操作?我的要求是在操作完成之前显示一个带有JProgressBar的对话框。

你可以在任何方法中使用 Thread.sleep(millis) 来模拟一个长时间运行的过程。是不是很简单 :-) - home
5
@home,这并不简单。你不能在EDT中睡觉。 - mre
1
你是指这个吗?:https://dev59.com/D0nSa4cB1Zd3GeqPMD7L - ypercubeᵀᴹ
@home:你说得对,我们不需要知道它是哪个线程,但我们必须知道它不是哪个线程。它不在EDT上。 - Hovercraft Full Of Eels
2
@Hovercraft:我同意。不过,我的理解是OP已经有了一个“阻塞”数据库调用,无论在哪个线程中。因此,如果只是模拟一个长时间运行的进程,让当前线程休眠应该可以解决问题(当然可能存在其他问题)。 - home
显示剩余5条评论
1个回答

6
使用后台线程(例如SwingWorker提供的线程)运行一个for循环,从1到10,并在循环内部使用Thread.sleep。然后,如果是确定模式的JProgressBar,则可以通过将10 *循环索引传递到进度条来更新其值(当然要在Swing线程即EDT上执行此操作)。
编辑: @James Poulson:如果您使用SwingWorker对象,则可以使用publish/process方法和done方法在EDT上进行更新。如果您使用自己的后台线程,则确保将任何一组Swing调用包装在Runnable中,并使用invokeLater将其排队到EDT上。

+1 在工作线程上睡眠以模拟延迟是完全可以的,如此处所示:https://dev59.com/hW445IYBdhLWcg3w6eXz#4637725。 - trashgod
@HovercraftFullOfEels 感谢您的回答。我想问一下,如何确保组件在EDT上更新?我需要使用invokeLater吗? - James P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接