2012-03-05 136 views
0

線程之間來回取整數值的正確方法是什麼?如何將一個int值從一個線程發送到另一個線程?

我有兩個線程運行run(){}函數。一個是接收/發送USB消息,另一個是運行遊戲UI。他們都獨立工作。使用來自USB的數據修改遊戲的價值是問題領域。

我到目前爲止嘗試過的:我嘗試創建一個名爲container的全局對象,它包含一個public int變量並將其傳遞給兩個線程進行通信,但運行時會使程序崩潰。

編輯:我可以將文件保存到SD卡,並讓其他線程查看它嗎?線程1需要寫入SD卡,線程2需要讀取它。沒有必要進行雙向通信。

編輯:如果有辦法創建一個應用程序範圍,全局變量的類型爲int或包含一個int的應用程序範圍的對象,這將工作。如果這樣做,我想這樣做。

+1

請提供您的代碼和錯誤的堆棧跟蹤 – christophmccann 2012-03-05 00:33:27

+0

@christophmccann:我該怎麼做?我必須在通過USB連接到微控制器的手機上運行應用程序,但我無法同時通過USB連接到計算機。 – SwimBikeRun 2012-03-05 00:35:27

+0

至少提供你的代碼然後... – christophmccann 2012-03-05 00:36:17

回答

3

您應該堅持使用Android線程模型。例如,請參閱this

UI線程是Android中的主線程。 如果你的UI線程不是主線程,你做錯了什麼。

從上面的鏈接,不要使用AsyncTask,因爲你需要不止一次(我推測)修改UI的東西。撥打電話

myActivity.runOnUIThread(new Runnable() { 
    @Override 
    public void run() { 
     someUIelement.setValue(someIntReadFromUSB);  
    } 
} 

從您的線程讀取USB。當你聲明該Runnable時,你需要在範圍中有someUIElementsomeIntReadFromUSB。如果它們是該範圍內的局部變量,則必須確保它們是final變量。 (如果你必須申報整數最後,你可以聲明一個新的最後一個變量對你定義了Runnable之前並複製你要發送到它的價值。)

2

使用AtomicInteger

+1

有沒有必要的價值是AtomicInteger,這是非常足夠的,如果地址值是4字節對齊! – 2012-03-05 00:40:51

+0

so原子整數是一種全局跨線程? – SwimBikeRun 2012-03-05 00:43:11

+0

@ user1018733如果您對兩個線程均可用的AtomicInteger實例進行了引用,那麼可以,兩者都可以使用它並查看其他線程對其進行的更改(AtomicInteger提供必要的原子性和可見性保證)。 – 2012-03-05 00:46:19

0

「燦我將文件保存到SD卡,並讓其他線程查看它?線程1需要寫入SD卡,線程2需要讀取它,不需要雙向通信。「

我想你可以試一試java.util.concurrent.SynchronousQueue。

順便說一句,我對Android一無所知,但在純java這應該工作。