2011-01-26 61 views
4

我試圖在我的Java GUI應用程序中實現多線程,以在運行幾個密集方法時釋放接口。我主要來自C#開發背景,並且在該環境中多次使用線程,並沒有太多的困難。從C#背景實現Java中的線程

大致爲:

C#

  • 對象創建一個線程
  • 分配給它一個方法,從
  • 啓動線程啓動現在

到Java應用程序本身它是一個GUI應用程序,它有幾個perfo按鈕rm不同的動作,應用程序使用MIDI API播放MIDI音符,我具有播放,停止和添加單個音符等功能。 (需要注意的一個關鍵是我不播放MIDI文件,但手動創建音符/信息,通過音軌播放它們)。

有三個特別的操作我想在自己的線程運行存儲MIDI

  1. 播放通過一個文本框
  2. 生成100個散記
指出
  • 顯示儀表清單

    我有一個名爲MIDIControl的類,它包含所有必要的功能,例如播放,停止和生成我需要的消息的實際操作。存在用於GUI形式本身FooView.Java類創建該對象的一個​​實例,這意味着,例如:

    1. 按下「生成」
    2. 事件處理程序執行在FooView的「GenerateNotes」的方法。 Java類
    3. 然後,此方法執行的MIDIControl實例

    我已經看了實現通過Java和線程我已經看到它以不同的方式進行的C#方法「生成」的方法,任何人都可以向我解釋我如何能夠在我的線程中實現線程情況如何?

    如有需要,我可以提供代碼示例,謝謝您的時間。

  • +0

    你到底在問什麼? – SLaks 2011-01-26 20:46:22

    回答

    6

    Java線程的創建方式與C#線程相同,只是您將線程傳遞給Runnable而不是委託。 (因爲Java不支持代表)

    +0

    我知道Runnable是一個接口,所以每個類只能有一個.run()的實現,或者我誤會了嗎? – 2011-01-26 22:20:36

    2

    Java GUI應用程序中的後臺任務通常使用SwingWorker類完成,該類專門爲此目的而設計。

    1

    正如其他人所說它是SwingWorker類你後,這將使Swing組件仍然發射任務在另一個線程,並通知其完成和進步在一個線程安全的方式。你不能只使用原始線程可運行對象來分散隨機線程,然後期望通過那些線程與swing進行交互;通過設計,swing不是線程安全的,所以通過這種方式來做事,你幾乎可以肯定會在你的代碼中引入微妙的線程錯誤。

    根據您使用的Java版本,您可以單獨下載SwingWorker,也可以使用API​​中內置的SwingWorker。

    如果您使用的是Java 6(或以上),那麼擺動工人是核心APIhere英寸

    如果你使用Java 5的那麼Java 6版本已經被移植here

    如果您使用的是較早的版本,那麼你就必須添加太陽的原始版本,其中here

    2

    您需要區分更新GUI的任務和不更新的任務。

    如果你的工作需要更新GUI元素,比如你的任務(2),你需要子類SwingWorker的。處理代碼(呼叫您的exising庫)會覆蓋doInBackground(),通過publish()發送任何數據。然後,您的SwingWorker覆蓋可以與您的Swing組件進行交互。

    原因:Swing不是線程安全的,因此,如果從比事件指派線程(EDT)其他線程訪問它可能會打破。美國東部時間將運行process()

    對於不更新GUI的任務,創建一個新類,該類實現Runnable,並在run()方法中插入相應的MIDI庫代碼調用。然後,您可以將此作爲目標傳遞給new Thread(myRunnable).start()中的新線程。