我想使用信號量使一個線程等待發生在它之外的信號與信號量,但我不知道它爲什麼不工作。可能是我不瞭解Android信號量的原因,因爲我已經使用一些實時操作系統(如FreeRTOS和MXLite)使用相同的「操作方式」,並且它工作正常。Android的信號量停止線程
實際上,我有一個線程每次在其run()方法內執行一個while循環時運行一個服務。該服務執行一些長操作,然後死亡,我只是希望線程不會在前一個操作完成之前運行新服務。
的代碼看起來像(condLog僅僅是一個doeas與Log.i如果通過一個DEBUG定義爲真正的字符串的函數):
public Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
startScheduler(msg);
}
};
private static boolean serviceRunning = false;
private static Context context; // context is set in the main class contructor
private executeScheduledAction myThread = new executeScheduledAction();
private void startScheduler(Message msg) {
condLog("startScheduler- message received...");
myThread .releaseSemaphore();
}
private final class executeScheduledAction extends Thread {
private final static int MAX_CONCURRENT = 1;
private Semaphore semaphore = new Semaphore(MAX_CONCURRENT, true);
public executeScheduledAction() {}
public void releaseSemaphore() {
semaphore.release();
condLog("releaseSemaphore - Semaphore released, semaphore permit: " + semaphore.availablePermits());
}
@Override
public void run() {
condLog("executeScheduledAction - thread started...");
serviceRunning = true;
while(serviceRunning){
try {
condLog("executeScheduledAction - taking semaphore, semaphore permits: " + semaphore.availablePermits());
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
condLog("executeScheduledAction - semaphore taken, running service");
// HERE RUN THE SERVICE
}
condLog("Thread finished...");
}
}
第一個呼叫myThread.start方法。正如我所料,信號量是第一次被採取,並且服務正確啓動。最後,服務將消息發送到調用executeScheduledAction.release的處理器...這是我獲得的logcat的:
executeScheduledAction - 線程開始...
executeScheduledAction - 以信號,旗語證:1個
executeScheduledAction - 旗語截取,運行服務
executeScheduledAction - 以信號量,信號量許可:0
startScheduler - REC消息eived ...
releaseSemaphore - 信號量釋放,信號量許可證:2
爲什麼是2,而不是1?它看起來像我不釋放相同的信號我收購...
真的,任何幫助將是有益的和讚賞。
謝謝大家非常 克里斯蒂亞諾
謝謝你的回答,但我不認爲這是問題所在。正如你可以在LogCat行中看到的「...信號量,信號量許可:0」,信號量塊在許可爲「0」時(正確,在獲取後它們到-1)。問題是信號量被許可0阻塞,但是當我釋放時,我讀取許可= 2,這是我無法理解的。而且,當我釋放時,線程執行不會開始,並且創建一個想法,即我沒有釋放我正在獲得的信號量,我不知道爲什麼。順便說一句,我會看看CountDownLatch,當然,謝謝。 –