0

요구 사항 : 먼저 요구 사항을 설명하고 어떻게 처리했는지 알려줍니다. 나는 백엔드 시스템에 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 호출이 작동하지 않습니다를 호출 피하기 위해 무엇을 할 수 있는지 알 수 있습니까?

답변

0

http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt() 스레드가 차단되지 않고 인터럽트를 호출하면 '인터럽트'상태 플래그가 설정된다는 것을 제외하고는 아무 일도 발생하지 않습니다.

그래서 당신은 스레드의 측면에 중단 처리 할 수 ​​있습니다

for (int i = 0; i < inputs.length; i++) { 
    heavyCrunch(inputs[i]); 
    if (Thread.interrupted()) { 
     // We've been interrupted: no more crunching. 
     return; 
    } 
} 

당신은 여기에 더 많은 예제를 찾을 수 있습니다 : 응답, 안드레이에 대한

http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

+0

감사합니다. 나는 약간의 인터넷 검색 후에 isInterrupted 검사가 하나의 예제와 같이 반복되는 작업에 대해 수행되어야 함을 알고 있습니다. 그러나, 나는 잠시 동안, 각 작업과 그 후에 약간의 변환에 걸리는 webservice 호출을하고있다. 방해 할 수있는 방법이 있습니까? 웹 서비스가 응답하지 않으면 내가 두려워하는 것이기 때문입니다. 그 다음 스레드가 다시 시작될 때까지 특정 스레드를 차단하지 않을까요? –

+0

@AnoopHallimala, 스레드 자체에서 원격 연결을 시간 초과해야 할까 봐 걱정됩니다. Thread.stop()은 더 이상 사용되지 않으므로 사용하지 마십시오. 자세한 내용은 http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html을 참조하십시오. – StKiller