FutureTask保持活跃状态

时间:2014-02-27 18:30:18

标签: java executorservice

这是一个非常简单的代码:

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

                    return 0;
                }

    });

计数10然后退出......简单。

我这样执行:

    Executor executor = Executors.newCachedThreadPool();
    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); 
        System.out.println("the task has timed out "+result);
    }

我在控制台中得到“一切正常”,因此任务正确执行并返回。 然而,线程仍然存在!我可以通过执行它进入eclipse看到它:红色方块,标记正在执行的程序,仍然是活动的。 但我的主要打印后打印“一切都好”,所以它一定是那个任务。 为什么不关闭?我怎么能关闭它?

我在ExecutorService类中看到了一些有关闭方法的例子,但是我不想关闭整个线程池,因为我仍然需要它处于活动状态来接受其他任务,我只想让那个任务关闭!

1 个答案:

答案 0 :(得分:3)

Executors.newCachedThreadPool()的文档指出它“创建一个根据需要创建新线程的线程池,但是当它们可用时将重用先前构造的线程...未被使用60秒的线程终止并从缓存中删除。“

你等了六十秒了吗?