2016-09-09 4 views
0

Runnable 인터페이스를 구현하는 클래스 MyRunnable이 있습니다. 이 클래스는 다음과 같이 메인 스레드에서 통해 인스턴스된다Runnable의 인터럽트는 다른 스레드도 인터럽트합니까?

MyRunnable myRunnable = new MyRunnable(); 
Thread thread = new Thread(myRunnable); 
thread.start(); 

MyRunnable 스레드를 멈추는 stop() 방법을 구현하고 또한 현재 스레드에서 interrupt()를 호출 스레드가 어떤 원인 중단, 그러나

public void stop() 
{ 
    LOG.info("Stopping"); 
    this.runService = false; // reset running flag in order to stop the while-loop 
    Thread.currentThread().interrupt(); // interrupt any blocking operations 
} 

내가 이해할 수없는 주요한 문제들. 나는이 스레드뿐만 아니라 모든 다른 스레드뿐만 아니라 메인 스레드를 포함하여 중단 것으로 나타났습니다! 이 데이터베이스 연결이 깨진 아무 것도이 스레드와 함께 할 등. 내가 인터럽트 호출을 제거하면 모든 것이 예상대로 작동합니다.

나는/시작/Runnable 중지 꽤 간단하지만 어쩌면 내가 뭔가 잘못하고 있다고 생각 했나요?

+2

어떤 스레드에서'stop()'메서드를 호출하고 있습니까? –

+0

메인 스레드에서. –

+0

'interrupt()'는 이전에 만든 스레드가 아니라 하나의 스레드를 인터럽트합니다. –

답변

3

아마도 메인 스레드에서 myRunnable.stop() (으)로 전화 할 것입니다. 이로 인해 Thread.currentThread().interrupt()은 단순히 주 스레드를 인터럽트합니다.

해당 메서드에서 호출 스레드에 대한 가정을하지 않아야합니다. 실행 가능 파일 실행을 위해 인스턴스화 된 스레드를 실제로 인터럽트하려는 경우, Runnable 구현에 대한 thread 참조를 전달하고 currentThread()을 사용하는 대신 thread.interrupt()을 호출해야합니다.

+0

고마워, 그건 합리적으로 들리 네. 'Runnable' 인터페이스를 구현하는 대신에'MyRunnable'가 java.lang.Thread를 확장하면 (자),'Thread.currentThread(). interrupt()'호출은 메인 thread를 인터럽트하는지, 실제로는 ** 단지 현재의 thread만을 인터럽트합니까? 내부적으로'InterruptException'을 잡아야하기 때문에 클래스를 변경하는 것에 대해 오히려 생각합니다. –

+0

@MarkusL 또한 인터럽트 플래그를 확인하는 것이 필요합니다. 그러한 메소드를 호출하지 않는 한, InterruptedException는 Throw되지 않습니다. –