• Java并发案例04---Future和 FutureTask


    4.Future和 FutureTask

    4.1 Future是Callable的返回结果。

    它有三个功能
    • 1.判断任务是否完成
    • 2.能够中断任务
    • 3.能够获取任务返回结果

    4.2 FutureTask

    FutureTask 实现了RunnableFuture接口,RunnableFuture这个接口又继承自Runnable和Future
    因此FutureTask 既可以作为Runnable被线程执行(通过包装Callable对象),又可以作为Future得到Callable返回值。
    public FutureTask(Callable<V> callable) {
        if (callable == null)
                throw new NullPointerException();
            this.callable = callable;
            this.state = NEW;       // ensure visibility of callable
        }
    
    public FutureTask(Runnable runnable, V result) {
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }
    
    
    两个构造方法,FutureTask接口是Future的唯一实现类。
    实现了Callable的对象
    class Task implements Callable<String> {
    	
    	
    	@Override
    	public String call() throws Exception {
    		TimeUnit.SECONDS.sleep(5);
    		System.out.println("我睡了5s");
    		return "success";
    	}
    }
    
    方法1:通过FutureTask包装task,然后使用Thread的方式执行
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    		
    		Task task = new Task();
    		/**
    		 * 用FutureTask包装Task对象,然后给thread去执行
    		 */
    		FutureTask<String> ft = new FutureTask<String>(task);
    		
    		new Thread(ft).start();
    		
    		System.out.println("主线程获取运行结果为:"+ft.get());
    }
    
    
    
    方法2:通过FutureTask包装task,然后使用线程池的方式执行
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    		
    	ExecutorService executorService = Executors.newCachedThreadPool();
    
    	Task task = new Task();
    	/**
    	 * 用FutureTask包装Task对象,然后给线程池去执行
    	 */
    	FutureTask<String> ft = new FutureTask<String>(task);
    	
    	
    	Future<String> result = executorService.submit(task);
    	
    	executorService.shutdown();
    	
    	System.out.println("主线程获取运行结果为:"+result.get());
    		
    }
    
    方法3:直接使用线程池提交Callable对象
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    		
    	ExecutorService executorService = Executors.newCachedThreadPool();
    
    	Task task = new Task();
    	
    	Future<String> result = executorService.submit(task);
    	
    	executorService.shutdown();
    	
    	System.out.println("主线程获取运行结果为:"+result.get());
    		
    }
    
    
    

    总结

    Future是一个接口, FutureTask类是Future 的一个实现类,并实现了Runnable,因此FutureTask可以传递到线程对象Thread中新建一个线程执行。所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行。

  • 相关阅读:
    Java 快速入门-06-JDK 目录文件说明
    Java快速入门-05-数组循环条件 实例《延禧攻略》
    腾讯云服务器 选购+远程控制 图文教程
    无法获得锁 /var/lib/dpkg/lock
    Ubuntu 安装 PhpMyAdmin 图文教程
    基于Redis的BloomFilter算法去重
    CAP理论
    Linux常用命令回顾
    基于Solr实现HBase的二级索引
    Solr搜索服务架构图
  • 原文地址:https://www.cnblogs.com/leihuazhe/p/7762702.html
Copyright © 2020-2023  润新知