[英]Java GUI, need to pause a method without freezing GUI aswell
我知道这个问题是由主线程上的睡眠或等待调用引起的,关于如何解决这个问题的答案是将方法放入一个单独的线程然后使该线程进入休眠状态。 但代码是一团糟,并没有真正的时间来解决它并将其拆分为单独的线程,并想知道是否有任何其他方式这样做? 即使它不是使用GUI的最干净或最常见的做法。 我只需要从方法中暂停几秒钟。
如果不创建单独的线程,则无法执行此操作。 用Java创建线程很容易。 唯一需要注意的是,您只能通过主线程触摸UI。 因此,您需要使用SwingUtilities.invokeLater()之类的东西。
无法在事件线程上休眠并且不会导致GUI冻结。 但是在Swing中,事件线程是在幕后创建和管理的 - 您的主线程(源自main()
方法的线程) 不是事件线程。
所以,你可以安全地睡在主线程上。
我为java编写了一个超级简单的延迟函数,它不会让你的GUI冻结。 它每次使用它都有效,我想它也适合你。
void Delay(Long ms){
Long dietime = System.currentTimeMillis()+ms;
while(System.currentTimeMillis()<dietime){
//do nothing
}
}
例如:要将线程延迟5毫秒,请使用延迟(5L)
使用单独的代码线程是您唯一的解决方案。 必须将Swing线程启动的每个操作委托给一个单独的线程,否则会阻止GUI。
一个人会在哪里声明这个帖子。 请记住,任何对包含线程休眠的函数的引用都会导致主线程暂停。 因为主线程必须等待子线程暂停。
实际情况是线程不能作为单独的独立线程工作,因为线程必须从另一个线程启动。 换句话说,如果您正在创建桌面应用程序,即使您不使用其他线程,您的应用程序也是一个单线程应用程序。 现在,如果您开始使用线程并让它们进入睡眠状态,您很快就会发现您将无法在应用程序中执行任何其他操作。 否,没有其他线程甚至不会运行,因为他们正在等待第一个线程完成睡眠。 为什么是这样? 导致该线程是主线程的子线程,它是等待该睡眠子线程唤醒的主线程。 您无法设计无线应用程序,因为java是单主线程应用程序。 在您的应用程序中进一步定义的任何,是的任何线程始终在主线程中运行。
除非有人能证明我错了,否则你显然永远不会暂停你的主线程,因为这会锁定你的应用程序。 但是,一旦你定义了另一个线程并使用sleep()
暂停它,这也会锁定你的应用程序,因为线程是在主应用程序的子类中定义的,因此是主线程。
因此,暂停一个非常长的故事,暂停用户定义的线程,几乎与您在应用程序中的任何位置调用Thread.sleep()
完全相同,它会暂停整个应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.