こんにちは私は、サービス内のワーカースレッドを保持する無限ループを取り除きたいです。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();
}