zoukankan      html  css  js  c++  java
  • 29_Future模式2_JDK内置实现

    【Future使用场景】

    Future表示一个可能未完成的一部任务的结果,针对这个结果可以添加CallBack,以便在任务执行成功或失败后作出相应的操作。

    Future模式非常适合在处理耗时很长的业务逻辑时进行使用,可以有效旳减小系统的响应时间和提高系统的吞吐量。

    【Future的类图结构】

    【各个模块解释】

    Future接口:类似前文中描述的订单或者是契约,通过它,可以得到真实的数据。

    RunnableFuture接口:继承(接口与接口之间也是继承)了Future和Runnable接口,其中run()方法用于构造真实的数据。

    FutureTask类:实现了RunnableFuture接口的类,它有一个内部类:Sync。

    Sync内部类:FutureTask的一些实质的工作,会委托给Sync类去实现。

    Callable接口:Sync最终会去调用Callable接口,完成实际的数据组装工作。

    【关于Callable接口的注意点】

    Callable接口只有一个方法call(),它会返回需要构造的实际数据。

    Callable接口是Future框架和应用程序之间的重要接口,如果我们要实现自己的业务系统,通常需要实现自己的Callable对象,此外,FutureTask类也与应用密切相关,通常会使用Callable实例构造一个FutureTask实例,并将它提交给线程池。

    【Future的主要方法】

    public interface Future<V> {
    
        /**
         * Attempts to cancel execution of this task. 
         */
        boolean cancel(boolean mayInterruptIfRunning);
    
        /**
         * Returns {@code true} if this task was cancelled before it completed
         */
        boolean isCancelled();
    
        /**
         * Returns {@code true} if this task completed.
         */
        boolean isDone();
    
        /**
         * Waits if necessary for the computation to complete, and then
         * retrieves its result.
         * @return the computed result
         * while waiting
         */
        V get() throws InterruptedException, ExecutionException;
    
        /**
         * Waits if necessary for at most the given time for the computation
         * to complete, and then retrieves its result, if available.
         * while waiting
         * @throws TimeoutException if the wait timed out
         */
        V get(long timeout, TimeUnit unit)
            throws InterruptedException, ExecutionException, TimeoutException;
    }

    【Future接口方法理解】

    [ V get()方法 ]

    当任务结束后返回一个结果,如果调用时,工作还没有结束,则会阻塞线程,直到任务执行完毕。

    [ V get(long timeout, TimeUnit unit) 方法]

    多等待Timeout的时间后,就会返回结果

    [ boolean cancel(boolean mayInterruptlfRunning)  方法]

    来停止一个任务,如果任务可以停止(通过设置mayInterruptIfrunning来判断),则可以返回true,如果任务已经完成或者已经停止,则这个任务无法停止,直接返回false。

    [ boolean isDown()方法 ]

    判断当前方法是否已经完成。

    [ boolean isCancel()方法 ]

    判断当前方法是否已经取消。

    【JDK中的Future模式 实例】

    /**
     * Created by HigginCui 
     */
    class RealData implements Callable<String> {
    
        private String data;
    
        public RealData(String data) {
            this.data = data;
        }
    
        /**
         * call()方法
         * 1.可能是一个很耗时的方法
         * 2.会构造我们需要的真实数据并返回
         */
        @Override
        public String call() throws Exception {
            Thread.sleep(5000); //这里执行的任务非常耗时
            return "Hello World to "+ data;
        }
    }
    
    public class FutureMain {
    
        public static void main(String[] args) throws Exception {
            //构造FutureTask
            FutureTask<String> futureTask = new FutureTask<String>(new RealData("HigginCui"));
    
            ExecutorService executorService = Executors.newFixedThreadPool(1);
    
            //执行FutureTask
            //这里开启线程执行RealData的call()执行
            executorService.submit(futureTask);
            System.out.println("请求完毕了---"+System.currentTimeMillis());
    
            //这里main线程可以继续做自己的事情
            Thread.sleep(2000);
            System.out.println("浪2秒钟后---"+System.currentTimeMillis() );
    
            System.out.println( "最后我们拿需要的真实数据:" + futureTask.get()+ " ---"+System.currentTimeMillis() );
    
        }
    }

    【运行结果 可以看到三条记录之间的时间差分别是2s,3s】

     【关于线程池的注意点】

    线程池的两个执行任务的方法:一个是execute()方法,一个是submit()方法。

    两个的区别:submit()执行的任务可以是实现Runnable接口或者Callable接口,

    而execute只能执行实现Runnable接口的任务。

    submit有返回值Future,而execute方法没有返回值。 返回值的Future值得注意的是有一个方法是get(),如果返回是null,证明任务执行完毕。

  • 相关阅读:
    端口被占用
    启动Windows防火墙提示“0x8007042c"
    vue创建全局组件
    vue中过度动画之列表添加删除动画实现
    vue中过渡动画(类名结合动画实现方式)
    vue中过渡动画(类名实现方式)
    this.$nextTick()方法的使用
    利用axios获取数据并渲染到视图层
    axios的简单使用
    watch深度监听
  • 原文地址:https://www.cnblogs.com/HigginCui/p/9398976.html
Copyright © 2011-2022 走看看