java 如何同步对象
How does synchronizing an object works in java
我正在制作一个基本的 android 游戏,我有一个显示游戏世界的片段。当我打开那个片段时,我创建了一个新线程,它只等到我的 NetworkThread
从服务器获取世界。另外我的 GetWorldThread
是一个 static
Thread
,我只在片段内部初始化。
这是我的 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
s 用于 wait
/synchronyzed
替代,如 here 所述。事实上,使用 wait()
在 2017 年已经过时
我正在制作一个基本的 android 游戏,我有一个显示游戏世界的片段。当我打开那个片段时,我创建了一个新线程,它只等到我的 NetworkThread
从服务器获取世界。另外我的 GetWorldThread
是一个 static
Thread
,我只在片段内部初始化。
这是我的 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
s 用于 wait
/synchronyzed
替代,如 here 所述。事实上,使用 wait()
在 2017 年已经过时