您好我想摆脱在服务中保存工作线程的无限循环。
我尝试使用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 :(得分:0)
错误是对方法使用synchronized关键字。它给一个带锁对象的工作线程一个双锁,另一个带有服务实例(this)对象,并阻止了服务的主线程。
现在可以很好地工作,并且当工作线程等待任务时,将CPU使用率从无限循环的常量12%降低到0%。