我正在制作一个基本的 Android 游戏,我有一个显示游戏世界的 fragment 。当我打开该 fragment 时,我创建了一个新线程,它只是等待我的 NetworkThread 从服务器获取世界。另外,我的 GetWorldThread
是一个 static
Thread
,我仅在 fragment 内初始化它。
这就是我的 GetWorldThread 的样子:
synchronized (this)
{
try
{
Log.d("getWorldThread", "waiting()");
wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
我的NetworkThread
看起来像这样
if (buffer instanceof World)
{
synchronized (WorldFragment.getWorldThread)
{
World.setWorld(((World) buffer));
Log.d("NetworkThread", "notifying World");
WorldFragment.getWorldThread.notify();
}
}
我的代码可以工作,但我想知道是否有一种方法可以更优雅地做到这一点?
最佳答案
如 documentation 中所述您始终应该在 while
循环中使用 wait()
。因此您的代码可能无法正常工作。
更优雅的方式是使用更多高级抽象。例如Future和标准 FutureTask
。这种方式允许您不编写循环之类的低级内容,从而避免错误。
更新:另请注意,有 Condition
s/Lock
用于 wait
/synchronyzed
替换为描述here 。事实上,使用 wait()
在 2017 年已经过时了
关于java - java中同步对象是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43084720/