2010-05-08 3 views
1

나는 그 클래스의 인터럽트 상태를 설정합니다 runnable 인터페이스를 구현하는 클래스 내에서 메서드를 설정하려고합니다. 클래스 내부에서 처리 할 수 ​​있기를 원하는 이유는 다른 정리해야 할 것들이 있기 때문입니다. 호출하는 대신 하나의 메서드를 호출하여 모든 작업을 수행 할 수 있기를 바랍니다. 예 :실행 가능한 클래스 내부에서 스레드를 인터럽트합니까? (자바)

현재 내 취소 코드는이 스레드의 인터럽트 상태를 올바르게 설정하지 않습니다.

public void cancel() 

{ 

    Thread.currentThread().interrupt(); 

    // other clean up code here. 

} 

만약 내가 어떻게 작동합니까?

감사합니다.

EDIT : 내가 작업 취소를 얻으려고 할 때, 나는 상태를 다시 설정하는 상태를 설정하지 않았으므로 guiThread.interrupt()를 주석 처리했습니다.

답변

3

interrupt()를 호출하기 만하면 호출 스레드가 아닌 guiThread가 인터럽트됩니다. 예 :

public void cancel() 

{ 

    guiThread.interrupt(); 

    // other clean up code here. 

} 

그러나 호출 스레드에서 정리 코드를 실행 하시겠습니까? 일반적으로 스레드 자체가 자체 클린업을 수행하는 것이 가장 좋습니다. 스레드가 중단되어 정리 준비가 완료된 시점을 알 수 없습니다. 인터럽트 될 때 스레드가 종료되면 interrupt() 다음에 join()을 추가 할 수 있지만 일반적으로 스레드 자체가 정리를 수행하는 것보다는 덜 바람직합니다. (나중에 이러한 작업에 별도의 스레드가 없어도 스레드 풀을 사용할 수 있습니다. 작업을 정리하면 훨씬 쉽게 관리 할 수 ​​있습니다.)

마지막으로 스레드는 자동적으로 인터럽트하고 그 일을 멈추십시오. Object.wait(), Thread.sleep() 등과 같은 인터럽트 상태를 검사하는 메소드를 호출하거나 Thread.isInterrupted()를 통해 인터럽트 상태를 명시 적으로 확인할 수 있습니다.

EDIT : guiThread에 cancel()이 있다고 생각합니다. 그건 아니에요. 그래서 인터럽트 호출을 변경했습니다.

+1

, 당신은 아마 당신의 GUI를 실행하지 않으려는 표준 스레드. Event Dispatch Thread에서 실행해야합니다. –

+0

'interrupt'를 호출 할 수 없습니다. '취소 '는'Gui'의 메소드이고'Thread'가 아니고'Runnable'입니다. –

+0

@ Alexander - 그걸 가져 주셔서 고마워요. 내 대답을 편집했습니다. – mdma

2

cancel의 모든 것을 수행하려면 Thread 매개 변수를 추가하고 guiThread를 전달하십시오.

void cancel (final Thread guiThread) 
{ 
    guiThread.interrupt(); 

    guiThread.join(); 

    // other cleanup code 
    ... 
} 

발신자 번호

Gui gui = new Gui() // class that implements runnable 

Thread guiThread = new Thread(gui, "gui thread"); 

guiThread.start() 

... 

... 

gui.cancel(guiThread); 
0

guiThread.interrupt(); 당신이 내부 클래스 메소드로부터 스레드를 중단 할 경우 잘 작동해야하지만, 당신은 수행해야합니다

public void cancel() { 
    if (isAlive()) { 
     this.interrupt(); 
    } 
} 

나 또한

public void cancel() { 
    if (!isInterrupted()) { 
     interrupt(); 
    } 
} 
관련 문제