java thread.sleep 也让 swing ui 进入睡眠状态
Posted
技术标签:
【中文标题】java thread.sleep 也让 swing ui 进入睡眠状态【英文标题】:java thread.sleep puts swing ui to sleep too 【发布时间】:2014-01-11 04:52:27 【问题描述】:我正在创建一个简单的测试应用程序,它通过 JFileChooser 使用 thread.sleep() 每小时对所选目录运行一次检查。但是当我选择目录并且方法运行时,ui面板变灰并且摆动位消失。该线程似乎将 ui 及其调用的方法置于睡眠状态。
if (option == JFileChooser.APPROVE_OPTION)
selectedDirectory = chooser.getSelectedFiles();
try
while (true)
runCheck(selectedDirectory);
Thread.sleep(1000*5);//1000 is 1 second
catch (InterruptedException e1)
Thread.currentThread().interrupt();
e1.printStackTrace();
我正在寻找解决此问题的方法,以便我可以打印在 ui .setText(result) 中运行的检查结果
【问题讨论】:
可能是SwingWorker
? download.oracle.com/javase/6/docs/api/javax/swing/…
考虑使用 Timer 和 TimerTask 来运行定时任务。它会更可靠。
@Andrew,实际上应该使用javax.swing.Timer
而不是 util 包中的 Timer。
@jjnguy,我只是想指出,一般来说,在 while 循环中使用 sleep 并不是一个及时重复任务的好方法,还有一种更可靠的方法。但是,是的,在这种情况下你是正确的。 :P
【参考方案1】:
您对使 UI 进入睡眠状态的代码是正确的。由于在事件调度线程(负责运行 gui 的线程)上调用了 sleep
,因此 UI 停止处理事件并“进入睡眠状态”。
我想你想要的是javax.swing.Timer
。
Timer t = new Timer(1000 * 5, new ActionListener()
public void actionPerformed(ActionEvent e)
// do your reoccuring task
);
这将导致您的重复任务在 EDT 之外执行,因此不会让您的 ui 无响应。
【讨论】:
"请注意,Swing 计时器的任务是在事件派发线程中执行的。这意味着该任务可以安全地操作组件,但也意味着该任务应该快速执行。" download.oracle.com/javase/tutorial/uiswing/misc/timer.html【参考方案2】:如果您发布的代码在 EventDispatchThread 上运行,则 Swing 无法重绘 GUI。您正在阻塞(休眠)应该处理该问题的线程!
【讨论】:
【参考方案3】:这是因为您正在运行您检查主 GUI 线程并使用无限循环。此检查是一项后台任务,应在其自己的线程中执行,以便 GUI 仍可接收用户输入并对其做出反应。
您也不需要编写自己的实现,Java 有一个Timer 对象。
编辑:还有一个 Swing 特定的 Timer 对象。这将使操作发生在 GUI 线程中,因此如果您的任务很长,它可能会导致 GUI 在操作发生时仍然锁定(但在等待时不会)。
【讨论】:
您链接到的计时器是util
包中的一个。与swing组件交互时,应使用swingTimer
。以上是关于java thread.sleep 也让 swing ui 进入睡眠状态的主要内容,如果未能解决你的问题,请参考以下文章