2014-07-23 2 views
0

Java에서 음성 인식 프로그램을 구현하려는 노력의 일환으로 실제 음성 인식 코드를 별도의 스레드에 구현했습니다. 주 스레드는 GUI 인터페이스를 처리하고 단어가 식별되면 음성 인식 스레드로부터 지속적인 업데이트를받습니다.스레드를 중지하고 정리 코드를 실행하는 가장 안전한 방법은 무엇입니까

사용자가 주 스레드의 GUI에서 종료 단추를 클릭하면이 스레드가 즉시 일부 정리 코드를 실행하고 종료됩니다. 내가 while 루프에 의존

public class VoiceRecognitionCore extends SwingWorker<List<String>, String> 
{ 
    //Variables and things here 

    @Override 
    public List<String> doInBackground() throws VoiceRecognitionException 
    { 
     //Code here 
     while(continueVoiceRecog == true) 
     { 
      //More code 
      Result result = recog.recognize(); 
      //More code 
     } 
    } 
} 

는 지속적으로 사용자가 "종료"를 클릭하면 메인 스레드으로 false로 설정됩니다 continueVoiceRecog의 상태를 확인 :

나는 현재 다음있다.

현재 문제는 코드가 recog.recognize() 메소드 내에 영구히있을 수 있기 때문에 while 체크로 다시 돌아 가지 않을 것입니다. 이것은 항상 일시적인 해결책으로 의도되었다는 점에 유의해야합니다.

DoInBackground()를 InterruptedException을 catch하도록 확장하려고하며 사용중인 리소스를 할당 해제하기 위해 정리 메소드를 호출하는 스레드 인터럽트를 사용합니다.

이 시나리오에서 가장 안전한 방법은 무엇입니까? 그것이 제가 제안한 것이라면, 내가 알아야 할 잠재적 인 문제가 있습니까?

답변

1

스레드 인터럽트 사용은 완벽하게 허용되는 경로입니다. 그러나 예제에서는 (SwingWorker 사용) cancel() 메서드를 대신 사용할 수 있습니다. 호출 코드에서

생성 한 후 VoiceRecognitionCore 당신은 작업자 종료 버튼 액션 청취자 cancel() 수 있습니다 : 당신의 recognize() 내 Thread.isInterrupted() :

final VoiceRecognitionCore worker = new VoicRecognitionCore(); 
    worker.execute(); 

    JButton exitButton = new JButton("Exit"); 
    exitButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      // True passed to Interrupt the underlying thread. 
      worker.cancel(true); 
      // other clean-up 
      // then System.exit(0); ? 
     } 
    }); 

그러나이 방법이의 상태를 확인해야합니다을 방법. (링크 참조 : http://docs.oracle.com/javase/tutorial/uiswing/concurrency/cancel.html을) 당신이 청소하는 물건을 필요로하고 isInterrupted() 플래그를 확인 할 수있는 능력이없는 경우

- 아마도 가장 좋은 방법은 당신의 recog 개체가 중반인지 확인 할 수있는 방법을 가지고있다 인식 ... 그리고 나가기 버튼이 눌려 졌을 때 - recog.isRecognizing()가 깨끗이 정리 한 다음 종료하면?

추신. 당신이 System.exit (0)을 수행한다면 그것은 논쟁의 여지가있을 것이다. 어쨌든, 깔끔하게 루프를 빠져 나가는 것은 아마도 불필요 할 것입니다. 그러나 파일 정리 등 다른 정리 작업을하는 경우에 따라 다릅니다.

관련 문제