2016-09-21 13 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)オブジェクトを持つワーカースレッドに二重ロックを与え、サービスのメインスレッドをブロックしました。

これはうまく動作し、ワーカースレッドがタスクを待機している間、無限ループの定数12%からCPU使用率を0%に落としました。