2014-02-27 5 views
0

이 자바 클래스에 대해 알아보기 위해 몇 가지 더미 프로그램을 만들고 있습니다. 시간 초과 작업은 중단하기 전에 3 초 동안 아무 것도하지 않는 작업을 호출합니다. 다음은 코드입니다 :FutureTask가 인터럽트하지 않는 것 같습니다.

FutureTask<Integer> task = new FutureTask<>(new 
      Callable<Integer>(){ 
       @Override 
       public Integer call() throws Exception { 
        int i =0; 
        while(i<100000){ 
         ; 
        } 

        return 0; 
       } 

    }); 

    executor.execute(task); 
    try { 
     task.get(3000, TimeUnit.MILLISECONDS); 
     System.out.println("Everything was ok"); 
    } catch (InterruptedException | ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TimeoutException ex){ 
     boolean result = task.cancel(true); //here i cancel the thread 
     System.out.println("the task has timed out "+result); 
    } 

무엇 발생하면 catch 블록이 실행되는 것입니다,하지만 내 프로그램은 스레드가 완료 될 때까지 실행 유지합니다. 그것은 task.cancel이 받아 들여지지 않은 것과 같습니다. 왜 그런가요?

답변

4

귀하의 작업은 계산에 구속되어 있습니다. 그것은 IO 나 절전을 수행하지 않으며, JVM이 인터럽트 플래그 (InterruptedException을 던지는 메소드)를 검사 할 때입니다. 따라서 작업은 중단되지 않습니다.

튜토리얼은 Interrupt입니다. 참고 :

이 InterruptedException을 throw하는 메서드를 호출하지 않고 스레드가 오랜 시간이 지나면 어떻게됩니까? 그런 다음 주기적으로 Thread.interrupted을 호출해야합니다. 인터럽트가 수신되면 이 수신되면 true를 반환합니다. 예를 들어

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

또한

인터럽트 메커니즘 인터럽트 상태라고도 내부 플래그를 사용하여 구현된다. Thread.interrupt를 호출하면이 플래그가 설정됩니다. 스레드가 정적 메서드 Thread.interrupted를 호출하여 인터럽트를 검사하면 인터럽트 상태가 지워집니다. 하나의 스레드가 다른 스레드의 인터럽트 상태를 쿼리하기 위해 사용하는 비 정적 인 isInterrupted 메서드는 인터럽트 상태 플래그를 변경하지 않습니다. 인터럽트 플래그를 재설정하지 않습니다

try { 
    // interruptible operation 
} 
catch (InterruptedException e) { 
    // do nothing 
} 

: 매우 자주 사람들이 뭔가를 작성합니다

참고. 이렇게하면 중단되지 않는 코드가 생성됩니다. 자세한 내용은 this JavaSpecialists newsletter을 참조하십시오.

+0

음 ... 문제는 내 실제 프로그램에 대해 jni 라이브러리에서 오는 연결을 캡슐화해야한다는 것입니다. 나는 이미이 연결로 같은 프로그램을 만들었고 어느 ​​쪽도 방해하지 않는다. 쓰레드가 멈추도록 강제하는 방법이 있습니까? – Phate

+0

자세한 내용은 위의 수정 된 답변을 참조하십시오. –

관련 문제