我的组件集成到第三方组件。我必须重写由第三方组件onTick()
的高优先级调用的方法。Thread
示例代码:
@Override
public void onTick() {
// do many useful operations
}
在某些情况下,这种onTick()
方法不应该执行那些“许多有用的操作”,因为它们的结果被丢弃了。实际上,onTick()
在这种情况下根本不需要 的功能,但是第三方组件不提供任何“暂停”或“睡眠”功能。onTick()
它一直在呼唤。这意味着 CPU 时间在这些特殊时期被不必要地耗尽了。
最直接的解决方案是通过适当的块向其发送信号onTick()
并使其线程休眠。但是,第三方组件的文档声明不应将其任意发送到等待状态。Object.wait()
synchronized
Thread
在这种情况下有什么解决方案可以节省 CPU 资源吗?也就是让别人使用CPU?我创建了以下解决方案,但我不确定它是否允许节省任何 CPU。(尽管如此,它至少应该节省“有用的操作”部分使用的其他资源onTick()
)。
@Override
public void onTick() {
// mJustUnpaused is volatile. Race condition, but probably harmless (?)
if (mJustUnpaused) {
mJustUnpaused = false;
// THREAD_PRIORITY_DISPLAY is the original
// priority used by the 3rd party Thread
Process.setThreadPriority(Process.THREAD_PRIORITY_DISPLAY);
}
if (!mRunningAllowed) {
return;
}
if (mPauseRequested) { // mPauseRequested is declared as volatile
synchronized (mPauseLock) {
if (mRunningAllowed && mPauseRequested) {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
mRunningAllowed = false;
mPauseLock.notify();
}
}
return;
}
// do many useful operations
}
暂停/取消暂停的方法(第一个是阻塞,第二个不是):
public void pauseWork() {
synchronized (mPauseLock) {
if (mRunningAllowed && !mPauseRequested) {
mPauseRequested = true;
while (mRunningAllowed) {
try {
mPauseLock.wait();
} catch (InterruptedException e) {}
}
} else {
Log.d("RPT", "Already paused or pausing");
}
}
}
public void unpauseWork() {
synchronized (mPauseLock) {
if (!mRunningAllowed) {
mRunningAllowed = true;
mPauseRequested = false;
mJustUnpaused = true;
} else {
Log.d("RPT", "No need to unpause");
}
}
}
三个问题:
- 有没有更好的方法来节省一些 CPU 时间?
- 不管其他一切,我上面的代码是否正确(在同步和其他编程方面)?
- 有点离题,但我认为它不值得一个专门的问题:更改线程的优先级是否有任何重大开销?有没有什么通用的指导方针可以做这样的事情?(例如多久可以完成一次等)