2015-01-26 6 views
0

주어진 시스템 및 성능 메트릭을 얻기 위해 모든 테스트 케이스 백그라운드에서 동시에 실행되는 스레드 풀이있는 자동화 된 테스트 스위트를 만들었습니다. 각 스레드는 JSch 연결을 사용하여 쉘 명령을 실행 중이고 [JSchException : 채널이 열리지 않은 예외]를 수신하고 있습니다.테스트 스위트가 완료 될 때 내 스레드가 종료되지 않는 이유는 무엇입니까?

중요한 문제는 모든 테스트 사례가 종료 된 경우에도 스레드가 종료되지 않기 때문에 테스트 스위트가 계속 실행된다는 것입니다. 하지만 확실하지 않습니다 ...

스레드 덤프를 검사했을 때 스레드가 차단 상태에 있기 때문에 스레드가 종료되지 않는 것을 발견했습니다.

아무도 설명이 없습니까? 또는이 문제를 해결하기위한 도움이 필요하십니까?

+1

테스트 코드를 게시 할 수 있습니까? – maffelbaffel

+1

스레드가 추가 작업을 기다리고있을뿐입니다. 명시 적으로 시작한 모든 서브 시스템을 명시 적으로 종료하여 테스트 세션을 종료해야합니다. –

+0

[뮤텍스 잠금 : "차단"의 의미는 무엇입니까?] (http://stackoverflow.com/questions/3982501/mutex-lock-what-does-blocking-mean). 스레드가 리소스에 대해 경합하는 것 같습니다 ... – gknicker

답변

0

나는 ExecutorService의 shutdownNow() 메소드를 의미하는 것으로 생각한다. 실행 중의 액티브 한 태스크 모든 정지

시도 대기 중의 태스크의 처리를 정지 해, 실행을 대기하고 있던 태스크의리스트를 돌려줍니다 :이 문서 (I 굵게의 관련 부분을 포맷)입니다.

이 방법 은 적극적으로 작업을 실행하여을 종료 할 때까지 기다리지 않습니다. 그것을하기 위해 awaitTermination을 사용하십시오.

적극적으로 실행중인 작업 처리를 중단하기 위해 최선의 노력을 다할 때까지는 보장 할 수 없습니다. 예를 들어, 일반적인 구현은 Thread.interrupt()를 통해 취소되므로 인터럽트에 응답하지 않는 모든 작업이 절대로 종료되지 않을 수 있습니다.

스레드 인터럽트는 협업 프로세스이므로 인터럽트에 응답하도록 스레드를 구현해야합니다. Why invoke Thread.currentThread.interrupt() when catch any InterruptException?

그래서 당신은 당신이 중단 된 상태를보고 다른 방법/스레드 그룹이있는 경우에만이 작업을 수행해야합니다

Thread.currentThread.interrupt에 대해 편집

1

)()이 질문을 참조하십시오. 귀하의 경우에는 아마도 그렇지는 않지만 상처를주지는 않습니다.

2) "ShellUtils.executeCommand"에서 외부 프로그램을 실행하고있는 것으로 보입니다. 이 메서드가 스레드 중단에 반응하지 않는 경우 문제의 원인이 될 수 있습니다.

+0

현재 각 스레드에서 InterruptedException을 잡아 스레드 루프에서 깨고 있습니다. 이것은 방해에 반응하기에 충분하지 않습니까? 또는 Thread.currentThread.interrupt()를 잡기 조건에 추가해야합니까? – tmcevoy

+0

Ie while (true) { try { 최종 문자열 출력 = ShellUtils.executeCommand (호스트 이름, 명령) .getStdOut(); final String [] measurements = output.split (Constants.RegularExpressions.NEWLINE); if (measurements.length == METRICS.length) { writeMetricData (measurements); } else { Logger.log (Level.SEVERE, "하나 이상의 명령을 실행하지 못했습니다"); } Thread.sleep (SLEEP_TIME); } catch (InterruptedException e) { 휴식; } – tmcevoy

+0

귀하의 의견에 따라 답변을 편집했습니다. – lbalazscs