11

我正在尝试实现一个示例应用程序来测试CallableExecutorService接口。

在我的应用程序中,我已经声明:

ExecutorService exSvc = Executors.newSingleThreadExecutor();

然后:

Future<Integer> test = exSvc.submit(
    new Callable<Integer>() {
        public Integer call() {
            for(int i = 0; i < 1000; i++){
                System.out.println(i);
            }
            return 1;
        }
    });

现在我试图在它终止之前停止该过程,我正在使用exSvc.shutdownNow()但它不起作用。

为了优雅地停止经典Thread,我通常使用某种条件变量。遵循哪种常见方法ExecutorService

4

2 回答 2

19

Future.cancel(true)ExecutorService.shutdownNow()使用线程中断。只要您不在任务中进行不间断的阻塞调用,您所需要的就是正确处理中断条件,如下所示:

for(int i = 0; i < 1000; i++){
    // Uses isInterrupted() to keep interrupted status set
    if (Thread.currentThread().isInterrupted()) {
        // Cannot use InterruptedException since it's checked
        throw new RuntimeException(); 
    }
    System.out.println(i);
}

如果您进行不间断的阻塞调用(例如网络 IO),事情会变得更加复杂,您需要以某种方式手动中断它们,例如通过关闭底层套接字。

于 2012-07-11T09:35:26.353 回答
1

这就是我的做法FixedThreadPool,希望对你有所帮助。

    ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    List<Future<Void>> results = new ArrayList<>();

    for (int i = 0; i < numberOfJobs; i++) {
        MyCallableJob job = new MyCallableJob (...);
        results.add(pool.submit(job));
    }

    for (Future<Void> result : results) {
        try { result.get(); }
        catch (InterruptedException | ExecutionException ignorable) { }
    }

    pool.shutdown();
于 2012-07-11T09:34:20.597 回答