2010-03-19 2 views
12

InterruptedException의 역할과 원인을 이해합니다. 그러나 내 응용 프로그램에서는 내 응용 프로그램에서만 알 수있는 스레드에서 SwingUtilities.invokeAndWait()을 기다릴 때 얻었고 응용 프로그램에서는 어떤 스레드에서도 Thread.interrupt()을 호출하지 않으며 결코 스레드의 참조를 다른 사람에게 전달하지 않습니다.누가 내 스레드를 방해합니까?

내 질문은 : 누가 내 스레드를 방해합니까?

말할 방법이 있습니까? InterruptedException에 인터럽트를 요청하는 스레드의 이름이 들어 있지 않은 이유가 있습니까?

는 나는이 작업을 수행하는, 우리는 다음을 사용하는 프레임 워크 또는 라이브러리가 될 수 있음을 읽을 수 있지만 내 스레드를 방해하는 나는 이유를 생각할 수 없다 :

  • 최대 절전 모드
  • Log4J를
  • MySQL의 커넥터
+8

나는 "누가 * DARES *가 내 스레드를 방해합니까?"라고 생각합니다. –

+2

+1 - Thread # join을 하시겠습니까? InterruptedException을 던집니다. – RubyDubee

+0

실제로 Scott입니다. 내 스레드가 중단되지 않는 것을 선호합니다 (어쨌든 요청을 따르고 싶지 않기 때문에). 우리는 Thread # # 스스로 참여하지는 않지만 invokeAndWait가 그러한 메커니즘을 사용한다고 상상할 수 있습니다. 그러나 Thead # join은 다른 스레드에서 인터럽트를 호출합니까? 또한 아무도 내 스레드가 완료 될 때까지 기다리지 않을 것이라고 확신합니다. – Thirler

답변

11

가능하면 Thread을 확장하고이 스레드의 interrupt() 메서드를 덮어 쓰면 스택 추적을 인쇄하거나 지원되지 않는 작업 예외가 발생할 수 있습니다.

확장 된 Thread 클래스를 사용하여 인터럽트 스레드에 대한 참조를 저장하고 인터럽트 된 예외를 catch하면 읽을 수 있습니다.

2

여기에 이상한 것이 있습니다. 우리가 중단하는 경우 doRun.run()의 실행을 끝내는 것을 발송 쓰레드 이벤트를 기다리는 동안 invokeAndWait의 자바 독에서

, InterruptedException

을 발생합니다()

당신이하는 것을 시도했다 EDT에서 실행 된 코드가 예외를 전송하는지 확인하십시오. 또는 해당 EDT 코드에서이 스레드의 변수 중 일부를 수정하려고합니다 (이 용어는 Java 언어에서 "정통"이 아님을 알고 있습니다 만, 내가 의미하는 바를 알기를 바랍니다 : 모든 코드가 동기화, 대기, 조인을 암시 함). 일반적으로

+0

우리가 기다리는 Runnable이 예외를 던지면 InvocationTargetException이 발생합니다. 기다리는 동안 우리 스레드가 잠금 장치를 가질 가능성이 있습니다. 우리는 교착 상태가 없다고 확신합니다. 기다리는 쓰레드는 대기중인 쓰레드에서 사용하는 대화 상자를 생성합니다. – Thirler

4

, 당신이 일을 누가 알고 싶다면, 디버거를 중단 점을 넣고, 거기 당신. 당신이 그것을 재현 할 수 있는지 추측에 대한 필요가 없습니다!이 경우

, 당신이 할 수있는 이동 Thread.interrupt()에 중단 점을 넣으십시오. 중단 점에 "거짓 긍정 (false positive)"히트가있는 다른 스레드가있는 경우 중단 점 조건을 추가 할 수 있습니다 (대부분의 IDE에서는이를 쉽게 수행 할 수 있습니다). 스레드의 이름을 확인하십시오.

관련 문제