2012-02-19 2 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 백그라운드에서 실행하고 직후 중지 프레임이 준비되었습니다. 나는 자바에서 매우 초보자이며, 나는 그것을 성취 할 수있는 훨씬 더 안전하고 안전한 방법이 있다고 생각한다. 그것에 대해 조언 해 주시겠습니까? 고맙습니다.

+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

나는 또한 귀하의 예제와 위의 링크에서 BlockingQueue의 예 모두에서 것을 언급해야한다의 용량을 가진 ArrayBlockingQueue를 사용 생산자 스레드와 소비자 스레드를 종료하는 의미에 대해서는 설명하지 않습니다. 완료하려면 정지 메커니즘을 추가해야합니다. 그렇지 않으면 메인 스레드가 종료 된 후에도 프로그램이 자체적으로 종료되지 않습니다.