【发布时间】:2011-10-15 18:35:51
【问题描述】:
我目前正在(尝试)编写一个小游戏。我有一个小的设计/死锁问题。
当我按下一个按钮时,一个新的 Intent 会打开,surfaceDestroyed 设置一个布尔值来设置线程休眠。 当我返回时,线程会收到通知信号。
这在大约 90% 的时间内有效(当我使用 eclipse 调试时为 100%)。
我相信死锁发生在线程的运行函数中(两个同步)。问题是,wait() 需要一个同步的线程,而 ondraw() 需要在 surfaceholder 上的锁。
我已经玩了一点,但所有其他组合都让一切变得更糟,我不知道如何解决这个问题。所以请帮忙:)
主题:
class BattleEarthThread extends Thread {
private SurfaceHolder _surfaceHolder;
private BattleEarthView _battleEarthView;
private boolean _run = false;
private boolean _suspended = false;
public SurfaceHolder getSurfaceHolder() {
return _surfaceHolder;
}
public BattleEarthThread(SurfaceHolder surfaceHolder, BattleEarthView panel) {
_surfaceHolder = surfaceHolder;
_battleEarthView = panel;
}
public void setRunning(boolean run) {
_run = run;
}
public void setSuspend(boolean suspend) {
_suspended = suspend;
}
public boolean getSuspended() {
return _run;
}
public boolean getRunning() {
return _run;
}
@Override
public void start() {
super.start();
_run = true;
}
@Override
public void run() {
Canvas c;
while (_run) {
c = null;
try {
synchronized(this)
{
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
if(_suspended)
this.wait();
else {
_battleEarthView.onDraw(c);
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}
【问题讨论】:
-
我们需要查看其他线程的代码才能完全理解这一点。
标签: java android multithreading deadlock