在Java中,如何將一個事件從一個子線程傳遞到主線程,而不凍結主線程在一個循環中?如何通過Java中的線程傳遞事件?
在線我只能找到解決方案,涉及主線程卡在一個無限的while循環檢查shared thread-safe event FIFO queue
(兒童放置事件)事件。 然後睡覺x
秒,然後重新開始。
我需要主線程處於活動狀態並執行其他操作,例如能夠處理GUI中的事件。當子線程發生什麼事情時,主線程必須調用.eventHappened()
。
在Java中,如何將一個事件從一個子線程傳遞到主線程,而不凍結主線程在一個循環中?如何通過Java中的線程傳遞事件?
在線我只能找到解決方案,涉及主線程卡在一個無限的while循環檢查shared thread-safe event FIFO queue
(兒童放置事件)事件。 然後睡覺x
秒,然後重新開始。
我需要主線程處於活動狀態並執行其他操作,例如能夠處理GUI中的事件。當子線程發生什麼事情時,主線程必須調用.eventHappened()
。
爲了避免凍結UI這應該做的伎倆:
1)傳入的工作併發隊列哪裏工作線程的工作線程或池在其運行的方法進行檢查。
2)完成併發隊列,其中與UI線程不同的偵聽器線程檢查循環。偵聽器線程使用異步設施/方法向UI調用更新以避免UI異常。
所以UI線程爲傳入的工作隊列提供事件或數據。工作者線程撿起它,完成工作並將結果發佈到工作完成隊列中。
監聽線程檢查工作完成隊列中的新項目並異步地向UI發佈結果。
您能否詳細說明一下:在這種方法中,我們需要對AWT調度線程進行異步訪問,因爲規範說所有的gui代碼都需要從該線程運行。所以要去那裏,我們使用SwintUtils.InvokeLater。但是,爲什麼我們可以直接從主線程調用方法?它完全是主程序的線程,而不是AWT事件調度線程。我錯了嗎? –
以後的AsyncInvoke是另一個「do work」隊列,但是用於UI主線程。這個內部對我們來說是透明的。 – efekctive
UI主線程是我第一次創建GUI元素的線程? –
如果你真的需要這樣使用一個子線程,你可能需要使用一個併發隊列。
如果你正在使用swing,你可以使用SwingUtilities.invokeLater()來執行代碼。然後它會在backgroundt線程中運行它,而不是手動使用子線程。
你需要的是一個**偵聽器**線程,當有事情要做時,它將事件數據傳遞給main ** OBJECT **。此事件數據將在偵聽器線程中處理。否則,您需要主線程執行檢查。您使用了多少個用戶名? – efekctive
請詳細介紹您的線程模型。原始線程?執行人? AWT?搖擺? SWT? – chrylis
主線程是我創建所有gui(Swing)的地方。另一個是原始工作者線程,下載並解析它。 Efektive,感謝您的回答,但在監聽線程上,我被困在同一個問題中,我如何將處理後的事件傳遞給主線程? –