取消线程的任务

 启动任务和线程都很容易。大多数时候,我们通常允许它们在结束任务后自行停止。 但是,有时候我们希望在任务或线程自然结束之前就停止它们,可能因为用户取消了操作, 或者应用程序需要快速关闭。

我们可能会因为很多原因取消一个活动的任务。 Thread的stop和suspend方法试图提供这样的机制,但是很快发现了严重的缺陷,座该避免使用


用户请求的取消:用户点击程序界面上的“cancel”按钮,或者通过管理接口请求取消。


限时活动:—个应用程序,需要在有限的时间内搜索问题空间,并且在规定时间内选择最好的解决方案。如果计时器超时,正在搜索的任务会被取消。


应用程序亊件:一个应用程序对问题空间进行分解搜索,使不同的任务搜索问题空间中不同的区域。当一个任务发现了解决方案,所有其他仍在丁作的搜索会被取消。


关闭,当一个程序或者服务关闭时,必须对正在处理的和等待处理的工作进行一些操 作。一个优雅的关闭,可能允许当前的任务完成;在一个更加紧迫的关闭中,当前的任务 就可能被取消了。

Future可以管理任务的生命周期,处理异常,获取结果,除此之外,还可以取消任务。

ExecutorService.Submit 会返回一个Future来描术任务。Future 有一个 cancel 方法, 它需要一个boolean类型的参数,当为true,并且任务当則正在运行于中,那么这个线程是应该中断的,此时,Future.get()将收到一个取消的异常CancellationException。把这个参数设置成false意味着“如果还没有启动的话,不要运行这个任务”,这应该用于那些不处理中断的任务。

public static void main(String[] a) {

        ExecutorService executor= Executors.newFixedThreadPool(2);//创建2个线程的线程池
        Future<String> future=executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("...");
                Thread.sleep(5000);
                System.out.println("...");
                return "结果";
            }
        });
        future.cancel(true);
        try {
            System.out.println(future.get()); //任务结果没有返回时,future.get()会一直阻塞
        } catch (CancellationException e) {
            System.out.println("CancellationException");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        executor.shutdownNow();
}


==========================================================================

关注微信公众号 “Java技术”,可以实时获取有价值的技术文章推送。

"Java技术"交流群: 245130488    

"Java软件工程师培训"系列课程正式推出,助你自学成才,进入IT行业。

知识改变不了命运,至少可以改善生活  


你可能感兴趣的:(取消线程的任务)