2010-04-19 93 views
3

我知道這個問題是由主線程中的睡眠或等待調用引起的,並且如何解決這個問題的答案是將該方法放入單獨的線程,然後使該線程睡眠。但是代碼很混亂,沒有時間把它整理出來並分解成單獨的線程,並想知道是否有其他方法來做這件事?即使它不是使用GUI的最乾淨或最常見的做法。我只需要從該方法暫停幾秒鐘。Java GUI,需要暫停一個不凍結GUI的方法

回答

8

如果不創建單獨的線程,則無法執行此操作。用Java創建線程很簡單。唯一需要注意的是你只能通過主線程觸摸UI。出於這個原因,你需要使用類似SwingUtilities.invokeLater()

+0

或者,如果他需要走另一條路,他可以使用javax.swing.SwingWorker爲關閉移動方法事件調度線程(EDT)。 – ILMTitan 2010-04-19 20:52:06

+0

鏈接已損壞。 – HewwoCraziness 2016-12-09 22:13:11

1

無法在事件線程上睡眠,也不會導致GUI凍結。但是在Swing中,事件線程是在幕後創建和管理的 - 您的主線程(源自main()方法的一個線程)是而不是事件線程。

因此,你可以安全地睡在你的主線程上。

0

爲代碼使用單獨的線程是您唯一的解決方案。如果以其他方式阻止GUI,則Swing線程啓動的每個操作都必須委派給單獨的線程。

-6

何處將聲明此線程。請記住,任何對包含線程睡眠的函數的引用都會導致主線程暫停。因爲主線程將不得不等待子線程暫停。

現實情況是,線程並不真正作爲單獨的獨立線程工作,因爲線程必須從另一個線程啓動。換句話說,如果您正在創建桌面應用程序,並且即使您不使用其他線程,您的應用程序也是單線程應用程序。現在,如果您開始使用線程&使其進入睡眠狀態,您很快就會發現,您將無法在應用程序中執行其他任何操作。沒有&沒有其他線程甚至不會運行,因爲他們正在等待第一個線程完成睡眠。爲什麼是這樣?因爲線程是主線程的子線程,並且它是等待該睡眠子線程喚醒的主線程。由於java是單主線程應用程序,因此無法設計無線應用程序。任何,是的,你的應用程序中進一步定義的線程總是在主線程中運行。

除非有人能證明我錯了,否則顯然不會暫停主線程,因爲這會鎖定您的應用程序。然而,只要你定義了另一個線程並用sleep()掛起它,這也會鎖定你的應用程序,因爲線程是在主應用程序的子類中定義的,因此也是主線程。

因此,爲了讓一個非常長的故事睡覺,暫停用戶定義的線程,幾乎完全相同,如果您的應用程序中的任何位置調用了Thread.sleep(),則它會暫停整個應用程序。

+2

這是不正確的。如果現有線程正在等待某些內容(例如鎖定可用)並且新線程阻止了該線程的發生(例如,通過保持該鎖定進行睡眠),則在新線程中休眠將只暫停現有線程。兩者之間必須有一定的依賴關係,以阻止另一方,儘管有很多間接的方法可以發生。 – 2011-08-26 23:59:25

0

我爲java編寫了一個超級簡單的延遲函數,它不會讓GUI凍結。它每次都使用它,我想它也適用於你。

 void Delay(Long ms){ 

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

對於例如:要延遲5個millisecods線程使用Delay(5L)

+0

這不會導致性能瓶頸嗎?我的意思是性能受到影響可能會導致GUI看起來像凍結。我想我已經測試過這種方法(用其他語言),並不是那麼好。雖然我不確定,但如果有效,這是一個很好的解決方案,我現在要測試 – 2013-12-25 16:22:15

+0

我不知道,我在android平臺上測試過它,但沒有成功。也許它適用於JVM – 2013-12-25 16:25:04

+0

這段代碼和'Thread.sleep'沒有區別,即它會停止當前的線程執行。所以,在GUI線程上執行會導致GUI凍結。 – 2014-07-17 10:16:20