shutdownNow with executor service

时间:2012-12-17 18:41:59

标签: java multithreading executorservice

我正在使用ExecutorService进行连接任务,如下所示:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<ApplicationConnection> future = (Future<ApplicationConnection>) executor.submit(new ConnectThread(crf, connoptions));
connection = future.get(300000, TimeUnit.SECONDS);
executor.shutdownNow();

call()方法调用.connect()方法(专有API)。这种连接方法会产生各种线程池等。我担心的是,如果将来超时并杀死执行程序,那么将来通过调用.connect()方法生成的线程也会结束吗?我知道杀死一个线程也会杀死任何子线程,但这是否遵循相同的逻辑?

2 个答案:

答案 0 :(得分:2)

你的假设是正确的,如果Future超时,一些悬空线将会保留。更糟糕的是,shutdownNow()甚至不会关闭您的池线程(更不用说专有的API线程)。它只是停止接受新的工作。一旦所有正在运行的任务完成,ExecutorService线程池将终止所有线程。

你可以做的是尝试取消未来并打断它。在你的未来首先处理InterruptedException

class ConnectThread implements Callbale<ApplicationConnection> {

    public ApplicationConnection call() {
        try {
            return prioprietaryApi.connect();
        } catch(InterruptedException e) {
            prioprietaryApi.cleanUp();
            throw e;
        }
    }

}

现在只需运行:

future.cancel(true);

但是,您的专有API可能无法处理InterruptedException(它不会从connect()重新处理它,而且您可能无法访问任何cleanUp()方法。

在这些情况下......只是......忘记它。 Future最终将终止并清理,忽略了你不再等待它的事实。当然,这可能会导致各种可伸缩性问题。

顺便说一句,如果您想要实现的唯一目标是限制给定方法运行的最长时间,请考虑TimeLimiter中的

答案 1 :(得分:1)

根据javadoc

  

尝试停止所有正在执行的任务,停止处理   等待任务,并返回正在等待的任务列表   执行。除了努力尝试停止之外,没有任何保证   处理积极执行的任务。例如,典型的   实现将通过Thread.interrupt()取消,所以任何任务   无法响应中断可能永远不会终止。