我運行兩個獨立線程(Android SDK)的一個主線程,另一個線程計算數字輸入傳感器上狀態更改的次數。我希望訪問主線程中的狀態更改計數以將數據發送到別處。我能否暫停傳感器線程,使用吸氣器傳遞值,然後恢復線程?我還想在取樣後重置計數器(使用setter?)。多線程變量訪問
實現此目的的最佳實踐是什麼?
我運行兩個獨立線程(Android SDK)的一個主線程,另一個線程計算數字輸入傳感器上狀態更改的次數。我希望訪問主線程中的狀態更改計數以將數據發送到別處。我能否暫停傳感器線程,使用吸氣器傳遞值,然後恢復線程?我還想在取樣後重置計數器(使用setter?)。多線程變量訪問
實現此目的的最佳實踐是什麼?
這類似於生產者消費者問題。你可以有一個單一的長度阻塞隊列。
主線程 - 消費者
其他線程(計數狀態變化)--producer
的Java API來解決生產者消費者問題:的BlockingQueue
閱讀值放在其他線程中,並將其放置在BlockingQueue(大小1)中。主線程將檢查隊列並讀取值。一旦讀取值'其他線程'可以再次提供一個新值。這將保證您的值由主線程讀取,然後重置。
API:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html
如果計數的int
,你可以從主線程訪問它沒有問題。
它是一個整數,但是我必須鎖定它嗎? – user1893700
無需鎖定整數。增加一個int是一個原子操作,你會在讀取的時候得到正確的值(只要有一個正確的值用於併發更新...) – zmbq
你應該使用同步的關鍵字,它可以保證你的代碼和平只用一個線程同時訪問。 下面是一個鏈接,其中包含更多詳細信息,用於描述類似於您的用例:http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
計數數字輸入傳感器上狀態變化次數的線程是如何工作的?它是否定期睡覺,或者傳感器以某種方式通知它? –
'wait()','sleep()'等 – Mordechai
它等待高價值。然後添加到計數器。然後重複 – user1893700