我在Java中學習線程時遇到了一些問題。我們的目標是做一個模擬,向我們展示兔子在某種棋盤上如何從狼羣中跑步。每隻狼和每隻兔子都應該是一條線索。所以我在Test類的主要方法中創建了一個GUI,並創建了一個實現Runnable接口的新類。我認爲這很簡單合乎邏輯。但是現在,我怎樣才能從這些線程調用AddRabbit
方法?因爲很多線程應該做mething,如:地圖 10個線程繪製在一個JPanel
- 變化般的地方它的屬性
- 油漆本身的面板
但如何呢?
我在Java中學習線程時遇到了一些問題。我們的目標是做一個模擬,向我們展示兔子在某種棋盤上如何從狼羣中跑步。每隻狼和每隻兔子都應該是一條線索。所以我在Test類的主要方法中創建了一個GUI,並創建了一個實現Runnable接口的新類。我認爲這很簡單合乎邏輯。但是現在,我怎樣才能從這些線程調用AddRabbit
方法?因爲很多線程應該做mething,如:地圖 10個線程繪製在一個JPanel
但如何呢?
不允許直接使用多線程更新Swing組件 - Swing不是線程安全的。還有就是它處理一個Swing事件隊列,所以如果你有在現有的線程來更新一個JComponent,你會使用下面的代碼:
//You are currently in a separate thread that's calculating your rabbit positions
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//Put in code to modify your Swing elements
}
});
所以每次你覺得需要更新您的圖形用戶界面,那麼您可以使用SwingUtilities.invokeLater方法將Runnable的實例傳遞到Swing事件隊列中,該方法將在其自己的線程中處理。
好,簡單而好的答案,但你沒有得到這個問題,或者我寫得不夠清楚。目標是在一個線程少的對象上運行。我需要在哪裏創建這個對象?在測試課上?現在我已經在Test類中創建了它,但是我覺得它不是個好主意,我不知道爲什麼^^無論如何謝謝! –
這是一個正確的方法;一個完整的例子見[這裏](http://stackoverflow.com/a/7519403/230513)。 – trashgod
我不知道如何給你一些喜歡或不喜歡,但謝謝你:) –
A continuation,建議here是從多線程更新GUI的好選擇,但可能難以正確同步對共享數據的訪問。
或者,使用javax.swing.Timer
定期更新管理狼和兔子屬性的模型。在網格上移動的對象的相關示例將被檢查here。爲了獲得更大的靈活性,請使用Model–View–Controller模式,圖示爲here。
您正在爲您的工作使用錯誤的工具。線程應該用在你想有*併發*執行時,這並不意味着並行(如通常假設的那樣),而是*沒有任何時序關係*。另一方面,*模擬*通常意味着所有參與者/組成部分之間的相互關係都是相互關聯的。你應該使用普通對象和一個'Timer'。 – Holger