요구 사항 : 먼저 요구 사항을 설명하고 어떻게 처리했는지 알려줍니다. 나는 백엔드 시스템에 3 번 전화를 걸기로되어 있었지만 너무 오래 걸리고 SLA를 위반하기 때문에 순차적 호출을 할 여력이 없었다.인터럽트가 스레드를 인터럽트하지 않고 강제로 멈춤
솔루션 : ExecutorService를 사용하여 3 개의 스레드를 만들고 각기 다른 3 가지 작업을 각각 수행했습니다.
final ExecutorService service = Executors
.newFixedThreadPool(NUMBEROFTHREADSTOSPAWNSIZE);
getSubsFutureCall = service
.submit(new GetSubsCallable(request));
getAccountDetailCall = service
.submit(new GetAccountInfoCallable(request));
getProvisioningCall = service
.submit(new GetProvisioningFromCallable(request));
responseGetSubs = getSubsFutureCall
.get(TIMEOUT_IN_MILLISECONDS, TimeUnit.MILLISECONDS);
responseGetAccountDetail = getAccountDetailCall
.get(TIMEOUT_IN_MILLISECONDS, TimeUnit.MILLISECONDS);
responseFromCPF = (SubscriptionType) getProvisioningCPFCall
.get(TIMEOUT_IN_MILLISECONDS, TimeUnit.MILLISECONDS);
결과 문제 : 시간 초과 후에도 생성 된 스레드가 계속 실행되므로 바람직하지 않습니다. 그래서 나는 모니터링 스레드를 도입했다. 모니터링 스레드는 실행중인 스레드 목록을 가져 와서 인터럽트한다.
for (Thread t : timeoutList) {
t.interrupt();
}
이 인터럽트가 작동하지 않습니다 !!!
나는 다른 프로젝트에서 비슷한 것을 한 것을 기억합니다. 너무 아름답게 작동했습니다. 우리의 OS는 OSX (Apple Mac)였습니다. 자, 저는 Windows OS에서 작업하고 있습니다. 그것이 문제일까요? 절망에서
나는 추가 :
for (Thread t : timeoutList) {
t.interrupt();
if(!t.isInterrupted() || t.isAlive()){
t.stop();
}
}
누군가가 내가 t.stop() 메소드 왜 t.interrupt 호출이 작동하지 않습니다를 호출 피하기 위해 무엇을 할 수 있는지 알 수 있습니까?
감사합니다. 나는 약간의 인터넷 검색 후에 isInterrupted 검사가 하나의 예제와 같이 반복되는 작업에 대해 수행되어야 함을 알고 있습니다. 그러나, 나는 잠시 동안, 각 작업과 그 후에 약간의 변환에 걸리는 webservice 호출을하고있다. 방해 할 수있는 방법이 있습니까? 웹 서비스가 응답하지 않으면 내가 두려워하는 것이기 때문입니다. 그 다음 스레드가 다시 시작될 때까지 특정 스레드를 차단하지 않을까요? –
@AnoopHallimala, 스레드 자체에서 원격 연결을 시간 초과해야 할까 봐 걱정됩니다. Thread.stop()은 더 이상 사용되지 않으므로 사용하지 마십시오. 자세한 내용은 http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html을 참조하십시오. – StKiller