【问题标题】:Calling sleep on current thread stalls my main GUI在当前线程上调用 sleep 会停止我的主 GUI
【发布时间】:2010-01-08 02:58:16
【问题描述】:

我有一个类DataThread 继承自 Thread。 我正在使用两个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? 是因为 sleep 是静态方法吗?如果是的话,有人可以建议如何在不影响Main_GUI 的情况下让WriteThread 睡觉吗?

【问题讨论】:

    标签: java user-interface multithreading halt


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我认为打电话给 Geeks 不一定是获得帮助的好方法,但要回答你的问题,你会看到睡眠,因为你在事件调度线程上调用 Thread.sleep。 Swing 的 GUI 操作在这个单线程上运行。如果你需要做长时间运行的后台工作,你应该把它委托给一个 SwingWorker。

      此外,中断异常的处理不是很健壮。至少,您应该使用 Thread.currentThread().interrupt() 重新中断线程。

      【讨论】:

      • 感谢您的建议.......在我的生活中,我永远不会称任何人为“极客”......但我能做些什么呢?我急需帮助... :)
      【解决方案3】:

      感谢大家向我推荐不同的选择..... 但是我使用了 TimeTask.schedule() 并且工作了。我将我的工作安排在以后,而不是在当前线程中使用睡眠......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-18
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        相关资源
        最近更新 更多