2009-02-14 51 views
6

如何將一個實時線程與Java中的普通線程同步?以一個實時線程爲例,計算一些溫度和GUI線程必須收集這些數字並在某些控件上顯示它們。與普通線程實時線程同步

實時庫的實現應該不重要,因爲它應該遵循規範。

回答

4

你將需要兩件事。你希望你的實時線程獲得優先級,最好是由定時器驅動,這樣你就可以(幾乎)進行週期性的測量。然後,您將需要一個可用於傳遞值的資源。這可以是一個簡單的監視器,具有一個臨界區域,以便定時器線程可以寫入它,或者它可能 - 更可能會更好 - 一個FIFO,以便GUI線程可以在任何時候吃掉值有周期。

在Java中,GUI(至少在Swing和類似中)已經運行了UI交互的獨立線程,所以你最大的問題是設置你的測量線程。看看Runnables。

2

要使用實時線程,您需要實時操作系統上的Real Time Java。 http://java.sun.com/javase/technologies/realtime/index.jsp

但是,如果你有一個對延遲敏感的線程,我建議你;

  • 在與其他線程通信中使用併發庫。
  • 儘量減少任何GC活動(ESP全GCS)
  • 不運行在同一進程線程的GUI,如果你能(因爲它往往攫取了大量的資源的方式,你可以控制在有限)
2

由於其他人提出了RTSJ,我會評論實時代碼和非實時代碼之間的同步有許多解決方案。 RTSJ爲此類溝通提供wait-free queues。也可以建立在這些或其他隊列之上,並利用RTSJ的AsyncEventAsyncEventHandler抽象來管理通信。這適用於您確實需要「實時」線程的確定性行爲的情況。

如果您可以接受盡力而爲的行爲(儘量努力達到最終期限,但如果您錯過了世界並不會分崩離析),我建議您在the Java concurrency utilities提供的執行程序框架上仔細構建。仔細選擇任務邊界,合適的排隊策略(在這裏,「合適」取決於你的應用程序的更多細節,而不是你所給出的),並且線程池策略將得到你所需要的。