在当前线程上调用sleep会使我的主GUI停顿

时间:2010-01-08 02:58:17

标签: java user-interface multithreading halt

我有一个继承自Thread的类DataThread。 我使用了两个DataThread个对象ReadThreadWriteThread。 我有另一个运行Main_GUI的线程。

现在,当我按下main_GUI上的按钮时,它会调用方法x.method1(),然后此方法使用WriteThread方法WriteThread.sleepForReset()。在

public void sleepForReset(){
    try {
        sleep(28000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

当我按下main_GUI上的按钮时,GUI停止28000毫秒。 如果我在WriteThread呼叫睡眠,那么为什么它会暂停main_GUI? 是因为睡眠是一种静态的方法吗?如果是,是否有人可以建议如何在不影响WriteThread的情况下睡眠Main_GUI

3 个答案:

答案 0 :(得分:6)

如果您从WriteThread.sleepForReset()方法中调用actionPerformed,则实际上是在EventDispatch线程中调用它。即使你有一个代表你的WriteThread的对象,从EventDispatch线程中调用该对象上的方法将导致该进程在EDT中执行。

在Java中使用工作线程看一下this tutorial。请注意,只有一个继承自Thread的类是不够的,您需要启动这些Thread的实例才能拥有多线程应用程序。提供的教程将为您提供一个入门方法的好主意。

答案 1 :(得分:1)

我认为召唤Geeks并不一定是获得帮助的好方法,但是为了回答你的问题,你会看到睡眠,因为你在事件调度线程上调用了Thread.sleep。 Swing的GUI操作在这个单线程上运行。如果您需要长时间运行后台工作,则应将其委派给SwingWorker。

此外,中断异常的处理不是很强大。至少,你应该用Thread.currentThread()。interrupt()重新打断线程。

答案 2 :(得分:-1)

感谢各位建议我不同的选择..... 但是我使用了TimeTask.schedule()并且工作了。我安排了我的工作,而不是在当前的线程中使用sleep ......