zoukankan      html  css  js  c++  java
  • 并发编程005 --- future &&futureTask

    Future

    用于异步计算,可以获取异步计算结果、取消异步任务、判断任务是否被取消、是否执行完成。

    1、get

    get()用于获取异步计算结果,如果计算未完成,则阻塞当前线程,直到计算完成

    task类

    public class CallableTask implements Callable<String> {
    
        @Override
        public String call() throws InterruptedException {
            System.out.println(Thread.currentThread().getName() + " start.");
            Thread.sleep(3000);
            System.out.println(Thread.currentThread().getName() + " finished.");
            return "Callable Task return.";
        }
    }

    测试类:

        public static void main(String[] args) throws ExecutionException, InterruptedException {
            ExecutorService service = Executors
                    .newFixedThreadPool(1, new ThreadFactoryBuilder().setNameFormat("test-%d").build());
    
            Future<String> future = service.submit(new CallableTask());
            System.out.println("calc result: " + future.get());
    
            System.out.println("Master run finished.");
    
    
            service.shutdownNow();
        }

    执行结果:

     get(time, timeunit),表示等待有限度,如果超过指定时间未完成,抛出超时异常

    测试类:

        public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
            ExecutorService service = Executors
                    .newFixedThreadPool(1, new ThreadFactoryBuilder().setNameFormat("test-%d").build());
    
            Future<String> future = service.submit(new CallableTask());
            System.out.println("calc result: " + future.get(2, TimeUnit.SECONDS));
    
            System.out.println("Master run finished.");
    
    
            service.shutdownNow();
        }

    执行结果: 可以看到,主进程抛出异常,线程执行完成

    2、cancel

    用来取消任务执行。如果任务执行完成,或者已经取消,或者由于未知原因不能取消,返回false;

    如果任务未开始,则返回true,并且任务永远不能被执行;

    如果任务已经开始执行,并且mayInterruptIfRunning指定为true,则中断该任务,否则允许任务执行完成    ----- 这里有点疑问,明天确认下

    场景1:任务执行完成后取消任务,返回false

    源码:

        public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
            ExecutorService service = Executors
                    .newFixedThreadPool(1, new ThreadFactoryBuilder().setNameFormat("test-%d").build());
    
            Future<String> future = service.submit(new CallableTask());
            Thread.sleep(4000);
    
            System.out.println("Future is cancel succeed? " + future.cancel(false));
    
            System.out.println("Master run finished.");
    
    
            service.shutdownNow();
        }

    执行结果:

     场景2:任务执行中,返回true

        public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
            ExecutorService service = Executors
                    .newFixedThreadPool(1, new ThreadFactoryBuilder().setNameFormat("test-%d").build());
    
            Future<String> future = service.submit(new CallableTask());
            Thread.sleep(1000);
    
            System.out.println("Future is cancel succeed? " + future.cancel(false));
    
            System.out.println("Master run finished.");
    
    
            service.shutdownNow();
        }

    执行结果:

     3、isCanceled

     任务执行完成之前被取消,返回true

    4、isDone

     任务被终止、被取消、出现异常,该方法均会返回true

  • 相关阅读:
    Windows 之 手机访问 PC 端本地部署的站点
    Java 之 Given final block not properly padded
    关于ie7下display:inline-block;不支持的解决方案
    Oracle 之 获取当前日期及日期格式化
    WebService 之 实例学习一
    第 3 章 共享程序集和强命名程序集
    第 2 章 生成、打包、部署和管理应用程序及类型
    第一章 CLR的执行模型
    CLR 之 内容概述
    网站跨站点脚本,Sql注入等攻击的处理
  • 原文地址:https://www.cnblogs.com/sniffs/p/11638180.html
Copyright © 2011-2022 走看看