Java ConditionVariable阻止两个线程同时运行
为了游戏编程的目的,我试图在一对Android线程之间强制执行同步。我已经分配了一个游戏线程,它处理大多数任务,和一个渲染线程,它负责交换缓冲区和渲染。当我第一次询问线程同步时,有人提到ConditionVariable对象是一个有用的工具,它可以强制线程阻塞,直到并发任务完成 我的源代码如下所示:Java ConditionVariable阻止两个线程同时运行,java,android,multithreading,condition-variable,Java,Android,Multithreading,Condition Variable,为了游戏编程的目的,我试图在一对Android线程之间强制执行同步。我已经分配了一个游戏线程,它处理大多数任务,和一个渲染线程,它负责交换缓冲区和渲染。当我第一次询问线程同步时,有人提到ConditionVariable对象是一个有用的工具,它可以强制线程阻塞,直到并发任务完成 我的源代码如下所示: ... final ConditionVariable bufferLock = new ConditionVariable();
...
final ConditionVariable bufferLock = new ConditionVariable();
final ConditionVariable cycleLock = new ConditionVariable();
bufferLock.open();
cycleLock.open();
Runnable bufferSwapTask = new Runnable()
{
public void run()
{
swapBuffers();
bufferLock.open();
}
};
Runnable renderTask = new Runnable()
{
public void run()
{
Log.d(TAG, "drawAll");
drawAll();
cycleLock.open();
}
};
while(!halt)
{
if(!init)
{
synchronized (userInputLock)
{
fetchUserInput();
}
processUserInput();
gameLogic();
bufferLock.block();
cycleLock.close();
renderThreadHandler.post(renderTask);
recycleDisplayObjects();
enqueueDisplayTree();
cycleLock.block();
bufferLock.close();
renderThreadHandler.post(bufferSwapTask);
}
}
...
因此,事情按正确的顺序执行,但没有达到我预期的性能水平。而且,当我激活DDMS方法跟踪时,我发现DVM实际上会中断并阻塞每个线程,以允许另一个线程恢复,并以一种强烈暗示两个线程仅由一个CPU处理的方式来回切换
我使用ReentrantLocks获得了很好的同步处理结果,那么为什么ConditionVariable会有这种效果呢?Android上的Linux内核试图避免在内核之间移动线程。如果一个线程“可运行”(即可以运行但正在等待另一个线程)一段时间,内核可以决定将其迁移到另一个内核 在以前的实现中,如果您的一个线程倾向于连续运行,那么它可能会将另一个线程保持在“可运行”状态足够长的时间,从而导致内核迁移它。新的实现可能会以较小的步骤进行,并低于阈值 FWIW,其他人对此感到困惑,例如和