2012-02-19 6 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: ваш код кажется мне необычным - но я не эксперт по резьбе. Является ли ваша программа каким-либо образом графическим интерфейсом? Это java.awt.Frame? Если да, почему бы не использовать Swing и javax.swing.JFrames? Если GUI рассмотрит возможность использования SwingWorkers. И если вы не получите достойных ответов в ближайшее время, подумайте о том, чтобы предоставить немного более подробную информацию, если это возможно. –

+1

@Hovercraft Full Of Eels: я думаю, я должен переименовать его. Это просто чистая Java, без дополнительных фреймворков. – Kael

ответ

1

Это классическая проблема производителей-потребителей. Я предлагаю вам избегать использования wait() и notify(), потому что их трудно получить, даже для опытных разработчиков.

Вместо этого ознакомьтесь с интерфейсом BlockingQueue и используйте пример в комментариях в качестве руководства. Это похоже на то, что вы ищете.

Если требуется, что не более чем один кадр не генерируется заранее, а затем использовать ArrayBlockingQueue с мощностью 1.

Следует также отметить, что в обоих вашем примере и примере BlockingQueue в приведенной выше ссылке , семантика для отключения производителей и потребительских потоков не объясняется. Вам нужно будет добавить механизм остановки, чтобы быть полным, иначе ваша программа не будет закрыта сама по себе, даже после того, как основной поток умер.

Смежные вопросы