2017-03-29 13 views
0

私は基本的なアンドロイドゲームを作っていますが、私はゲームの世界を表示する断片を持っています。私がそのフラグメントを開くと、私はNetworkThreadがサーバーから世界を得るまで待つだけの新しいスレッドを作成します。また私のGetWorldThreadstaticThreadであり、フラグメント内でのみ初期化します。私GetWorldThreadがどのように見えるかオブジェクトを同期させるとJavaで動作する方法

は、これは次のとおりです。

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

この投稿を参照してください:http://stackoverflow.com/questions/442564/avoid-synchronizedthis-in-java/36692190#36692190 –

答えて

1

documentationに記載されているように、wait()whileループです。したがって、コードが正しく動作しないことがあります。

もっとエレガントな方法は、より高いレベルのabstracnionsを使用することです。たとえば、Futureとなり、FutureTaskとなります。この方法では、ループのような低レベルのものを書くことができず、したがってミスを避けることができます。

更新:またhereを説明するようwait/synchronyzed置換することを目的Condition S/Lock秒があることに注意してください。実際にはwait()を使用すると2017年で廃止されました

関連する問題