如何在java中同步对象

时间:2017-03-29 04:59:11

标签: java android multithreading android-fragments

我正在制作基本的Android游戏,我有一个显示游戏世界的片段。当我打开那个片段时,我创建了一个新的线程,等待我的NetworkThread从服务器获取世界。另外,我的GetWorldThreadstatic 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();
    }

}

我的代码有效,但我想知道是否有办法让这更优雅?

1 个答案:

答案 0 :(得分:1)

documentation中所述,您始终应在wait()循环中使用while。因此,您的代码可能无法正常工作。

更优雅的方式是使用更高级别的抽象。例如Future和标准FutureTask。这种方式允许你不要编写像循环这样的低级东西,以避免错误。

更新:另请注意,有Condition个/ Lock用于wait / synchronyzed替换,如here所述。事实上,2017年使用wait()已经过时了