如何让KeyListener使用主线程而不是EDT?

时间:2017-06-05 01:54:01

标签: java multithreading swing keylistener event-dispatch-thread

在我的程序中,我有一个按下按键时调用的方法。 在某个任务完成之前,该方法不应该返回,因此它会阻塞线程,例如:

while (!taskIsDone);

并使用javax.swing.Timer运行一些后台流程。

但是,由于KeyListener由事件调度线程处理,因此该方法会阻塞事件调度线程,而不是主线程,如果事件调度线程被阻止,则程序无法运行。

有什么方法吗?

1 个答案:

答案 0 :(得分:1)

  

并使用javax.swing.Timer运行一些后台进程。

不应使用Timer运行后台进程。定时器代码在EDT上执行。因此,长时间运行的任务将阻止GUI重新绘制自己并响应事件。

启动一个单独的线程来执行后台任务。

最简单的方法是使用SwingWorker

阅读Worker Thread and SwingWorker上Swing教程中的部分,了解更多信息和工作示例。

如果您想在执行任务时阻止进一步输入,也许您可​​以显示进度条,以便用户知道后台正在进行处理。