簡體   English   中英

如何在 Java 中創建“事件驅動”的后台線程?

[英]How can I create an “event-driven” background thread in Java?

我喜歡將工作單元發送到 AWT EDT 的invokeLater()的簡單性。 最好有一個類似的機制來將工作請求發送到后台線程(例如 SwingWorker),但據我了解,這些沒有任何類型的事件隊列和調度機制,這正是 invokeLater() 所依賴的。

因此,相反,我最終為我的后台線程提供了一個阻塞隊列,其他線程向該隊列發送消息,並且線程本質上運行一個接收循環,阻塞直到消息到達。

事實上,這可能正是人們在后台線程中實現類似 EDT 行為的方式(或者會這樣嗎?)。 另一方面,我喜歡簡單的線程,它只是惰性地懸掛在那里,每當它們碰巧從天空中一些看不見的事件調度隊列被調度到它時處理“工作液滴”。 Java 是否提供了創建這種“事件驅動的工作線程”的方法? 還是消息隊列是正確的方法呢? 與此相關的是, invokeLater()消息傳遞技術是否存在缺陷?

生產者-消費者設計模式(這是您在阻塞隊列中使用的)只是解決不同 class 問題的不同方法; EDT 采用工人設計模式 看看這兩種設計模式,看看哪一種最適合您的需求。

  • 當您有多個線程分別執行獨立任務時,通常使用生產者-消費者模式。
  • EDT 采用的 Worker 模式用於將多個任務的結果集中到單個線程(在本例中為 GUI 線程)。

當然,如果你有一個隊列和一個消費者有多個生產者,你可以采用生產者-消費者模式並實現與工人模式類似的行為,但這只是突出了設計模式的靈活性。 因此,再次強調,選擇設計模式是基於最適合您的特定情況的設計模式——當模式足夠靈活以適應您想要的行為時,沒有特別錯誤的選擇。

你應該看看 java.util.concurrent,更具體地說是在Executor的,它們通常只是一個可以處理這樣的請求的線程池: executor.execute(runnableTask); . 如果您希望單個線程處理所有請求,請使用單個線程創建線程: executor = Executors.newSingleThreadExecutor()' 還有 ExecutorService 可以在任務完成時返回一個值。

暫無
暫無

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

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