我正在制作一些虚拟程序来了解这个java类。 我的定时任务调用一个任务,在中断它之前不会给它3秒的时间。 这是代码:
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不被接受。那是为什么?
答案 0 :(得分:5)
您的任务受计算限制。它不执行任何IO或休眠,并且当JVM检查中断标志时(任何抛出InterruptedException
的方法)。因此,您的任务是不可中断的。
值得阅读Interrupt教程。注意:
如果一个线程长时间没有调用一个方法怎么办? 抛出InterruptedException?然后它必须定期调用 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