Java进阶之FutureTask的用法及解析

先上一个场景:假如你忽然想作饭,可是没有厨具,也没有食材。网上购买厨具比较方便(慢),食材去超市买更放心(快)。java

实现分析:在快递员送厨具的期间,咱们确定不会闲着,能够去超市买食材。因此,在主线程里面另起一个子线程去网购厨具。买好食材后,我就开始等待厨具到来。ide

 

FutureTask是Futura和Callable的组合体。Callable是一个支持返回值的Thread。this

 

package com.test;.net

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;线程

public class FutureCook {get

    public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
        
        ExecutorService exec = Executors.newCachedThreadPool();     //建立一个线程池
        Future<String> hello = exec.submit(new Task("test"));          
        try {
            System.out.println("11111111111");
            System.out.println(hello.get(););
            System.out.println(hello.get(1000l,TimeUnit.MILLISECONDS));    //经过调用Future的get方法,获取线程的返回值
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("22222222222");
        
        
        
        long startTime = System.currentTimeMillis();
        // 第一步 网购厨具
        Callable<Chuju> onlineShopping = new Callable<Chuju>() {it

            @Override
            public Chuju call() throws Exception {
                System.out.println("第一步:下单");
                System.out.println("第一步:等待送货");
                Thread.sleep(5000);  // 模拟送货时间
                System.out.println("第一步:快递送到");
                return new Chuju();
            }
            
        };
        FutureTask<Chuju> task = new FutureTask<Chuju>(onlineShopping);
        new Thread(task).start();
        // 第二步 去超市购买食材
        Thread.sleep(2000);  // 模拟购买食材时间
        Shicai shicai = new Shicai();
        System.out.println("第二步:食材到位");
        // 第三步 用厨具烹饪食材
        if (!task.isDone()) {  // 联系快递员,询问是否到货
            System.out.println("第三步:厨具还没到,心情好就等着(心情很差就调用cancel方法取消订单)");
        }
        Chuju chuju = task.get();
        
        System.out.println("第三步:厨具到位,开始展示厨艺");
        cook(chuju, shicai);
        
        System.out.println("总共用时" + (System.currentTimeMillis() - startTime) + "ms");
    }
    
    //  用厨具烹饪食材
    static void cook(Chuju chuju, Shicai shicai) {}
    
    // 厨具类
    static class Chuju {}
    
    // 食材类
    static class Shicai {}io

    /**
     * Created by yulinfeng on 12/17/16.
     */
    public static class Task implements Callable<String> {
        private String name;class

        public Task(String name){
            this.name = name;
        }test

        @Override
        public String call() throws Exception {
            Thread.sleep(2000);
            String hello = hello(name);
            return hello;
        }

        public String hello(String name){             return "hello " + name;         }     } }

相关文章
相关标签/搜索