2016-09-21 74 views
0

您好我想擺脫一個無限循環,其中包含一個工作線程在服務中。Android服務和工作線程ReentrantLock無限循環

我嘗試使用ReentrantLock()方法,但我似乎無法讓它工作。

我的工作線程從JNI調用nativeWaitForTask方法並進入睡眠狀態。

但我的服務主線程似乎無法喚醒他在submitTask方法,他應該發信號的工作線程。

就像await()調用阻塞了服務的主線程一樣。

但他們在不同的線程,據我知道...

我做了什麼錯?爲什麼它不起作用?

private synchronized void nativeWaitForTask() { 

    threadLock.lock(); 

    try { 


     while(opcode == SR_Manager.STATE_IDLE) { 

      newTask.await(); 
     } 

    }catch (InterruptedException e) { 

     e.printStackTrace(); 
     Log.e(SR_Manager.DEBUG_TAG,"Failed to wait for new task! " + e.toString()); 

    }finally { 

     threadLock.unlock(); 
    } 
} 


    private synchronized void submitTask() { 

    if (nativeMain.isAlive()) { 

     dstImageName = sr.getDstImageName(); 

     if (sr.getSrcImagePath() != null && !sr.getSrcImagePath().equals(srcImagePath)) { 

      srcImagePath = sr.getSrcImagePath(); 
      width = sr.getWidth(); 
      height = sr.getHeight(); 
      format = sr.getFormat(); 
      algorithm = sr.getAlgorithm(); 
      value = sr.getValue(); 
      saveOutput = sr.getSaveOutput(); 
      opcode = SR_Manager.STATE_LOAD_IMAGE; 

     } else if (sr.getOpcode() != SR_Manager.STATE_LOAD_IMAGE) { 

      algorithm = sr.getAlgorithm(); 
      value = sr.getValue(); 
      saveOutput = sr.getSaveOutput(); 
      opcode = sr.getOpcode(); 
     } 

     t0 = System.currentTimeMillis(); 

    } else { 

     // No native thread no service... 
     silentCrash(-100); 
    } 

    // Wake the worker thread which waits for the new task condition 
    threadLock.lock(); 
    newTask.signal(); 
    threadLock.unlock(); 
} 

回答

0

錯誤是對方法使用synchronized關鍵字。它給工作線程一個帶鎖對象和一個帶有服務實例(this)對象的雙重鎖,並且阻塞了服務的主線程。

現在很好用,並且在工作線程等待任務時,將CPU使用率從無限循環的12%降爲0%。