2015-02-04 2 views
0

스레드를 사용하여 JFrame에 이미지를 그리는 중입니다.
키를 청취하기 위해 keyListener를 추가했습니다. P을 눌렀을 때 이미지 그리기가 중단되고 P을 다시 누르면 도면이 다시 시작됩니다.자바에서 스레드가 재개되지 않습니까?

이것을 구현하기 위해 동기화 된 블록과 함께 대기/알림을 사용해 보았습니다.
일시 중지 만 작동하지만 이력서는 작동하지 않습니다.
이상한 ...

public static void main(String[] args) 
{  
    static JFrame window1 = new JFrame(); 
    static boolean isPaused=false; 
    Runnable r = new Runnable() 
    { 
     public void run() 
     { 
      while(true) 
      { 
       window1.paintImage();//fn to redraw an image 
      } 
     } 
    }; 

    final Thread t = new Thread(r); 

    window1.addKeyListener(new KeyListener() 
    { 
     public void keyPressed(KeyEvent e) 
     { 
      if(e.getKeyCode() == KeyEvent.VK_P) 
      { 
       if(isPaused==false) 
       { 
        synchronized(t) 
        { 
         try 
         { 
          t.wait(); 
         } catch (InterruptedException e1) 
         { 
          e1.printStackTrace(); 
         } 
        } 
        isPaused=true; 
       } else 
       { 
        t.notifyAll(); 
        isPaused=false; 
       } 
      } 
     } 
     public void keyReleased(KeyEvent arg0){} 
     public void keyTyped(KeyEvent arg0){} 

    }); 


    t.start(); 
    } 
} 

답변

1

당신은 Object.waitJavadoc을 통과해야한다. t.wait()이 실행되면 t이 아닌 현재 스레드가 "일시 중지됨"입니다. 더 정확히 말하면 이미지를 다시 그리기 위해 만든 Thread t이 아닌 입력 처리를 담당하는 SWING 스레드를 일시 중지하고 있습니다. t.wait()t.notifyAll()이이 동일한 스윙 스레드에 의해서만 접근 될 수 있기 때문에 절대로 오는 notify()을 수신 할 때까지 스윙 스레드를 기다립니다. (잠들기 때문에 스스로 깨우기 위해 기다리고 있습니다. .. 좋은 결과 내길 바랄 게).

final boolean [] pause = new boolean []{false}; 
    Runnable r = new Runnable() 
{ 
    public void run() 
    { 
     while(true) 
     { 
      if(!pause[0]) 
      window1.paintImage();//fn to redraw an image 
     } 
    } 
}; 

... 

public void keyPressed(KeyEvent e) 
    { 
     if(e.getKeyCode() == KeyEvent.VK_P) 
     { 
      if(!pause[0]) 
      { 
       pause[0] = true; 
      } else 
      { 
       pause[0] = false; 
      } 
     } 
    } 
: 여기

은 (는 동기화를 신경 쓰지 않기 때문에, 아니지만 최적의) 하나 개의 솔루션을 수정하는 것입니다
관련 문제