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の初心者であり、それを達成するためのはるかに優れた安全な方法があると感じています. それについてアドバイスをいただけますか?ありがとうございました。

4

1 に答える 1

1

これは典型的な生産者/消費者問題です。wait()とnotify()は、経験豊富な開発者であっても正しく理解するのが難しいため、使用しないことをお勧めします。

代わりに、BlockingQueueインターフェースを確認し、コメントの例をガイドとして使用してください。これはまさにあなたが探しているもののようです。

事前に1フレーム以下を生成する必要がある場合はArrayBlockingQueue、容量1のを使用してください。

また、上記のリンクの例とBlockingQueueの例の両方で、プロデューサースレッドとコンシューマースレッドをシャットダウンするためのセマンティクスが説明されていないことにも言及する必要があります。完了するには停止メカニズムを追加する必要があります。そうしないと、メインスレッドが停止した後でも、プログラムが自動的にシャットダウンしません。

于 2012-04-25T12:46:34.990 に答える