在我的程序中,我有一个按下按键时调用的方法。 在某个任务完成之前,该方法不应该返回,因此它会阻塞线程,例如:
while (!taskIsDone);
并使用javax.swing.Timer
运行一些后台流程。
但是,由于KeyListener
由事件调度线程处理,因此该方法会阻塞事件调度线程,而不是主线程,如果事件调度线程被阻止,则程序无法运行。
有什么方法吗?
答案 0 :(得分:1)
并使用javax.swing.Timer运行一些后台进程。
不应使用Timer运行后台进程。定时器代码在EDT上执行。因此,长时间运行的任务将阻止GUI重新绘制自己并响应事件。
启动一个单独的线程来执行后台任务。
最简单的方法是使用SwingWorker
。
阅读Worker Thread and SwingWorker上Swing教程中的部分,了解更多信息和工作示例。
如果您想在执行任务时阻止进一步输入,也许您可以显示进度条,以便用户知道后台正在进行处理。