簡體   English   中英

Java thread.sleep也使ui進入睡眠狀態

[英]java thread.sleep puts swing ui to sleep too

我正在創建一個簡單的測試應用程序,該應用程序通過JFileChooser使用thread.sleep()在選定目錄上每小時運行一次檢查。 但是,當我選擇目錄並運行該方法時,ui面板變為灰色,擺動位消失。 線程似乎正在使ui及其調用的方法進入睡眠狀態。

if (option == JFileChooser.APPROVE_OPTION) {
    selectedDirectory = chooser.getSelectedFiles();
    try {
        while (true) {
            runCheck(selectedDirectory);
            Thread.sleep(1000*5);//1000 is 1 second
        }
    } catch (InterruptedException e1) {
        Thread.currentThread().interrupt();
        e1.printStackTrace();
    }               
} 

我正在尋找解決此問題的方法,以便我可以打印在ui .setText(result)中運行的檢查結果

您對使UI處於休眠狀態的代碼是正確的。 由於sleep是在事件調度線程(負責運行gui的線程)上調用的,因此UI會停止處理事件並“進入睡眠狀態”。

我認為您想要的是javax.swing.Timer

Timer t = new Timer(1000 * 5, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do your reoccuring task
    }
});

這將導致您的重復任務在EDT之外執行,因此不會使ui失去響應。

如果您發布的代碼在EventDispatchThread上運行,則Swing無法重繪GUI。 您正在阻塞(休眠)應該處理該線程的線程!

這是因為您在運行時簽入了主GUI線程,並且正在使用無限循環。 此檢查是一項后台任務,應在其自己的線程中執行,以便GUI仍可以接收用戶的輸入並對輸入作出反應。

您也不需要編寫自己的實現,Java有一個Timer對象。

編輯:還有一個特定於Swing的Timer對象。 這將使操作在GUI線程中發生,因此,如果您的任務很長,則可能導致GUI在執行操作時(而不是在等待時)仍然鎖定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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