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界面并使用评论中的示例作为指南。这似乎正是您正在寻找的。

如果要求提前生成不超过一帧,则使用ArrayBlockingQueue容量为1的an。

我还应该提到,在您的示例和上面链接中的 BlockingQueue 示例中,都没有解释关闭生产者和消费者线程的语义。您将需要添加一个停止机制才能完成,否则您的程序将不会自行关闭,即使在主线程已经死亡之后也是如此。

于 2012-04-25T12:46:34.990 回答