이 자바 클래스에 대해 알아보기 위해 몇 가지 더미 프로그램을 만들고 있습니다. 시간 초과 작업은 중단하기 전에 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이 받아 들여지지 않은 것과 같습니다. 왜 그런가요?
음 ... 문제는 내 실제 프로그램에 대해 jni 라이브러리에서 오는 연결을 캡슐화해야한다는 것입니다. 나는 이미이 연결로 같은 프로그램을 만들었고 어느 쪽도 방해하지 않는다. 쓰레드가 멈추도록 강제하는 방법이 있습니까? – Phate
자세한 내용은 위의 수정 된 답변을 참조하십시오. –