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。这样你就不用写循环之类的低级内容,从而避免错误。

更新:另请注意,有 Conditions/Locks 用于 wait/synchronyzed 替代,如 here 所述。事实上,使用 wait() 在 2017 年已经过时