簡體   English   中英

Java GUI,需要暫停一個方法而不凍結GUI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM