2012-11-05 3 views
0

나는 OptionPanel 스레드 자체를 종료하게하고 싶습니다. 스레드 클래스의 run 메서드에서 처리한다고 가정하지만 거기에 무언가를 동기화해야하는지 여부는 알 수 없습니다.어떻게 올바르게 종료 스레드가

JOptionPanel에서 올바른 옵션을 클릭하면 이러한 스레드가 종료되도록 만드는 방법은 무엇입니까?

import javax.swing.JOptionPane; 

public class Wat extends Thread { 
    private char c; 
    private int interv; 
    private volatile boolean running = true; 

    public Wat(char c, int interv) { 
     this.c = c; 
     this.interv = interv; 
    } 

    public void run() { 

     while (running) { 
      try { 
       System.out.println(c); 
       Thread.sleep(interv * 100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

    public static void main(String[] args) { 
     Wat w1 = new Wat('A', 3); 
     Wat w2 = new Wat('B', 4); 
     Wat w3 = new Wat('C', 5); 
     w1.start(); 
     w2.start(); 
     w3.start(); 
     Object[] options = { "Shutdown A", "Shutdown B", "Shutdown C" }; 
     int option; 
     while (w1.isAlive() || w2.isAlive() || w3.isAlive()) { 
      option = JOptionPane.showOptionDialog(null, 
        "Which one would you like to shut?", "Threads", 
        JOptionPane.YES_NO_CANCEL_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, options, options[2]); 
      switch (option) { 
      case JOptionPane.YES_OPTION: 
       w1.running = false; 
       break; 
      case JOptionPane.NO_OPTION: 
       w2.running = false; 
       break; 
      case JOptionPane.CANCEL_OPTION: 
       w3.running = false; 
       break; 
      } 
     } 

    } 

} 
+0

부분 복제본은 http://stackoverflow.com/questions/5562720/how-to-access-the-running-thread-runnable입니다. 그곳의 기술을 사용하십시오. –

+0

스레드를 중단하는 방법에 대한 정보는 다음과 같습니다. http://stackoverflow.com/questions/9791361/thread-not-interrupting/9791479#9791479 – Gray

+0

코드가 올바 른지 질문을 편집했습니다. 더 잘할 수 있습니까? – Robert

답변

2

당신이 가진 것을 감안할 때 :

Thread.sleep(interv * 100); 

내가 각 스레드에 interrupt을 보내 보는 것입니다. 인터럽트는 sleep() 메소드에 대한 것일 뿐이므로 부울 (예 : while (!done) {....})을 반복하는 통상적 인 방법보다 반응이 좋습니다.

위에서 링크 된 자습서뿐만 아니라 handling InteruptedExceptions에서 DeveloperWorks 기사를 확인하십시오.

+0

제어 흐름에 예외를 사용하는 것이 나쁜 습관이라고 생각하지 않습니까? – Brady

+0

이 인터 럽트 방법은 저에게 효과적이지 않았습니다. 내 질문을 편집 한 코드가 지금 정확한지? 더 잘할 수 있습니까? – Robert

+0

@ 브래디 - 저는 이것을 흐름 제어로 분류하지 않을 것입니다. 게다가, 당신은 소켓이나 이와 유사한 메커니즘을 쓰지 않고 기다리는 쓰레드를 어떻게 방해 할 것인가? –

관련 문제