【问题标题】:Java GUI, need to pause a method without freezing GUI aswellJava GUI,需要暂停方法而不冻结 GUI
【发布时间】:2011-02-09 17:39:52
【问题描述】:

我知道这个问题是由主线程上的睡眠或等待调用引起的,关于如何解决这个问题的答案是将方法放入一个单独的线程中,然后让该线程进入睡眠状态。但是代码是一团糟,真的没有时间整理它并将其拆分为单独的线程,并且想知道是否还有其他方法可以做到这一点?即使这不是使用 GUI 的最干净或最常见的做法。我只需要暂停该方法大约几秒钟。

【问题讨论】:

    标签: java user-interface multithreading freeze


    【解决方案1】:

    我为 java 编写了一个超级简单的延迟函数,它不会让你的 GUI 冻结。每次我使用它都有效,我想它也对你有用。

         void Delay(Long ms){
    
           Long dietime = System.currentTimeMillis()+ms;
           while(System.currentTimeMillis()<dietime){
               //do nothing
           }
       }
    

    例如:要将线程延迟 5 毫秒,请使用 Delay(5L)

    【讨论】:

    • 这不会造成性能瓶颈吗?我的意思是性能下降可能会导致 GUI 看起来像是被冻结了。我想我已经测试过这个方法(用其他语言)并且不是很好。虽然我不确定,如果可行,这是一个很好的解决方案,我现在要测试
    • 不知道,我在android平台上测试过,还是不行。也许它适用于 JVM
    • 此代码与Thread.sleep 没有什么不同,即它将停止当前线程的执行。因此,在 GUI 线程上执行会导致 GUI 冻结。
    【解决方案2】:

    在哪里可以声明这个线程。请记住,任何对包含线程睡眠的函数的引用都会导致主线程暂停。因为主线程必须等待子线程暂停。

    现实情况是线程并不能真正作为单独的独立线程工作,因为一个线程必须从另一个线程启动。换句话说,如果您正在创建桌面应用程序,即使您不使用其他线程,您的应用程序也是单线程应用程序。现在,如果您开始使用线程并将它们置于睡眠状态,您很快就会发现您将无法在应用程序中执行任何其他操作。不,其他线程甚至不会运行,因为它们正在等待第一个线程完成睡眠。为什么是这样?因为线程是主线程的子线程,而等待睡眠子线程唤醒的是主线程。您也不能设计无线程应用程序,因为 java 是单主线程应用程序。在您的应用程序中进一步定义的任何,是的,任何线程始终在主线程中运行。

    除非有人能证明我错了,否则你显然永远不会暂停你的主线程,因为这会锁定你的应用程序。但是,一旦您定义另一个线程并使用 sleep() 将其挂起,这也会锁定您的应用程序,因为该线程是在主应用程序的子类中定义的,因此是主线程。

    所以说个很长很长的故事,暂停用户定义的线程,几乎与您在应用程序中的任何位置调用Thread.sleep() 完全相同,它 暂停整个应用程序。

    【讨论】:

    • 这是不正确的。如果现有线程正在等待某些东西(例如,锁可用)并且新线程正在阻止这种情况发生(例如,在持有该锁的同时休眠),那么在新线程中休眠只会暂停现有线程。两者之间必须存在 某种 依赖关系,以使一方停止另一方,尽管有许多间接方式会发生这种情况。
    【解决方案3】:

    为代码使用单独的线程是您唯一的解决方案。 Swing 线程启动的每个操作都必须委托给单独的线程,否则会阻塞 GUI。

    【讨论】:

      【解决方案4】:

      如果不创建单独的线程,您将无法做到这一点。在 Java 中创建线程很容易。唯一需要注意的是,你只能通过主线程来触摸 UI。因此,您需要使用SwingUtilities.invokeLater() 之类的内容。

      【讨论】:

      • 或者,如果他需要另辟蹊径,他可以使用 javax.swing.SwingWorker 将该方法移出事件调度线程 (EDT)。
      • 链接已损坏。
      【解决方案5】:

      不可能在事件线程上休眠而不导致 GUI 冻结。然而在 Swing 中,事件线程是在幕后创建和管理的 - 您的主线程(源自 main() 方法的线程)不是事件线程。

      所以,你可以安全地睡在你的主线程上。

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 2015-05-09
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多