2012-02-19 12 views
0

私は非常に簡単な問題を解決しようとしています。私はフレームと毎回このフレームを準備する別のスレッド(FrameThread)を描画するメインスレッドを持っています。両方のスレッドが同じMyFrameオブジェクトを共有する必要があります。メインスレッドからFrameThreadを制御したい、つまり:MyFrameは準備ができている - >メインスレッドに描画する - > FrameThreadを実行し続ける。現在、私は次のようでした。その後オブジェクトを共有し、スレッドの実行をメインスレッドから制御する

private class FrameEngine 
{ 
    private boolean isFrameReady = false; 
    private MyFrame frame; 

    public synchronized void generateFrame() 
    { 
     while(isFrameReady) 
      wait(); 
     frame = FrameGenerator.nextFrame(); 
     isFrameReady = true; 
     notifyAll(); 
    } 

    public synchronized MyFrame getFrame() 
    { 
     while(!isFrameReady) 
      wait(); 
     isFrameReady = false; 
     notifyAll(); 
     return frame; 
    } 
}  

を私はFrameThread作成:

private class FrameThread implements Runnable 
{ 
    private final FrameEngine frame_eng; 

    public FrameThread(FrameEngine engine) 
    { 
     frame_eng = engine; 
    } 
    @Override 
    public void run() 
    { 
     while(true) 
      frame_eng.generateFrame(); 
    } 
} 

そして最後に、メインスレッド:

FrameEngine frame_engine = new FrameEngine(); 
Thread frameThread = new Thread(new FrameThread(frame_engine)); 
frameThread.start(); 
... 
while(true) 
{ 
    ... 
    drawFrame(frame_engine.getFrame()); 
    ... 
} 

だから私の目標は次のとおりです。FrameThreadはバックグラウンドで実行された直後に停止しますフレームが準備完了です。私はJavaで非常に初心者ですが、私はそれを達成するためにはるかに安全な方法があると感じています。あなたは私にそれについて助言を与えることができますか?ありがとうございました。

+1

@HovercraftFullOfEelsあなたは正しいです。 – Juvanis

+0

@Kael:あなたのコードは私にとって珍しいようですが、私はスレッドの専門家ではありません。どのような方法であなたのプログラムはGUIですか?これはjava.awt.Frameですか?もしそうなら、Swingとjavax.swing.JFramesを使用してみませんか? GUIがSwingWorkersの使用を検討する場合。そしてまもなくまともな回答が得られない場合は、できるだけ詳細を提供することを検討してください。 –

+1

@Hovercraft Eelsの完全:私はそれを名前を変更する必要がありますと思います。これは単なる純粋なJavaであり、追加のフレームワークはありません。 – Kael

答えて

1

これは、プロデューサ/コンシューマの古典的な問題です。私はwait()とnotify()の使用を避けることをお勧めします。これは、熟練した開発者であっても、正しい取得が難しいためです。

代わりに、インターフェイスをチェックアウトし、コメントの例を参考にしてください。これはまさにあなたが探しているものと思われます。

私もあなたの例とBlockingQueueの例の両方で上記のリンクにあることを言及する必要があります。1.

の容量を持つArrayBlockingQueueを使用し、その後、1個以下のフレームを事前に生成する必要がある場合プロデューサスレッドとコンシューマスレッドをシャットダウンするためのセマンティクスは説明されていません。完了するためには停止機構を追加する必要があります。そうしないと、メインスレッドが終了した後でも、プログラムは自動的にシャットダウンしません。

関連する問題