2014-01-06 80 views
0

我想使用信號量使一個線程等待發生在它之外的信號與信號量,但我不知道它爲什麼不工作。可能是我不瞭解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?它看起來像我不釋放相同的信號我收購...

真的,任何幫助將是有益的和讚賞。

謝謝大家非常 克里斯蒂亞諾

回答

0

Semaphore已去負被阻塞。在這種情況下,您可以使用CountDownLatch。如果我沒有誤解你的話,它應該更適合你的需求。

+0

謝謝你的回答,但我不認爲這是問題所在。正如你可以在LogCat行中看到的「...信號量,信號量許可:0」,信號量塊在許可爲「0」時(正確,在獲取後它們到-1)。問題是信號量被許可0阻塞,但是當我釋放時,我讀取許可= 2,這是我無法理解的。而且,當我釋放時,線程執行不會開始,並且創建一個想法,即我沒有釋放我正在獲得的信號量,我不知道爲什麼。順便說一句,我會看看CountDownLatch,當然,謝謝。 –