FutureTask似乎没有中断

时间:2014-02-27 13:01:15

标签: java executorservice

我正在制作一些虚拟程序来了解这个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不被接受。那是为什么?

1 个答案:

答案 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