zoukankan      html  css  js  c++  java
  • 新手浅谈Future

    Future到底是什么东西?很多人都对这个东西感到特别奇怪(好吧,我承认,那个很多人就只是我自己而已),就我现在的理解,因为本人在并发这方面没有 多少实践经验,所以只好就着一些资料和自己的理解给它下个定义,Future就是保存我们任务的完成信息,比如说,任务中会通过返回某些东西告诉别人它已 经结束了,而Future中就保存了这种信息。利用Futu保存和得到任务的结果的用法如下: 

    复制代码
          Future<String> future = threadPool.submit(new Callable<String>(){
               @Override
               public String call() throws Exception{
                    Thread.sleep(3000);
                    return "future";
               }
            try{
                 System.out.println("waiting.....");
                 System.out.println(future.get());
            }catch(InterruptedException e){
                  e.printStackTrace();
            }catch(ExecutionException e){
                  e.printStackTrace();
            }
    复制代码

              注意到没?代码中的System.out.println(future.get())这一句,就是返回任务的结果,而任务的结果是保存在Future<String>中的,相信大家都有注意到,        

         Future<String> future = threadPool.submit(new Callable<String>(){
           @Override
            public String call() throws Exception{}
           }

             Callable相当于Runnable,所以,这里实现的是一个线程,但是与Runnable不同的是,它是具有返回值的,这 个返回值就是我们想要任务返回的结果,比如说,我们想要任务返回的是一个提示信息,那么,返回值可以是String,然后在我们要实现的call()方法 中return一句提示信息,接着只要使用Future类的get()方法,就可以从里面得到提示信息了,只要任务完成。所以,由此我们可以知 道,java SE5比起以前来,在并发这方面做了更多的工作,它完善了我们的并发线程机制,使我们可以更好的根据任务的完成情况来进行与其他任务的协作,比如说,我们 可以通过Future的返回值来决定是否终止任务,或者开启另一个任务。任务的终止可以使用Future的方法 future.cancel(boolean),其中boolean为true或false,来决定是否终止,至于开启另一个任务,可以重新开启另一个线 程,但是这里就马上有个问题浮现出来,就是当Futrue的结果返回来时,该任务有没有结束呢?因为这时一定已经执行完该任务的call()方法。是的, 该任务已经结束了,只是我们没有取出它的返回结果而已。

            看到上面,相信大家一定都对Future的新特性产生非常浓厚的兴趣,非常想要将这个新玩意儿马上运用起来,但是,且慢,每次在遇到这种新东西的时候,我 们都会有一个念头,那就是我们有必要使用吗?如果旧的东西已经足够用了,那为什么还要用多余的方法呢?是的,这种想法是对的,因为我们的程序设计原则都是 能够尽量简单则尽量简单,但是Future是一个接口,一个泛型接口,适合各种返回值的情况,而且这个接口提供了很多有用的方法,再加上,我们永远无法知 道我们的代码以后到底会变成怎么样子,是否需要添加新的功能等等,而这些,如果一开始使用的是旧的东西的话,添加新的东西,那么,我们就要对我们的代码进 行修改,但是,我是这么认为的,就目前而言,Thread修改为Future并不是很难,所以,这方面倒是没有多大顾虑,熟悉啥就用啥,至少都要了解,因 为我们在写代码时,更多时间里是在阅读别人的代码,如果别人使用的代码是使用以前的接口的话,而且这种情况是非常常见的,所以,我们必须要看得懂代码并且 能够将其转化为我们的新接口,这些就需要我们能够对其有一定的了解,并且明白它们之间的联系和区别。所以,接下来就是介绍一下新接口的一些方法以便我们能 够更好的使用新接口。

        A、boolean cancel(Boolean mayInterruptlfRunning):试图取消该Future里关联的Callable任务
        B、<?> get()  throws InterruptedException, ExecutionException :返回Callable任务里的call方法的返回值,调用该方法将导致线程阻塞,必须等到子线程结束才得到返回 值,但是并不会妨碍其他任务的执行。线程被中断会抛出InterruptedException异常,任务执行中出现错误会抛出 ExecutionException异常,如果任务被取消,还会抛出CancellationException 异常。
        C、<?> get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException :返回Callable任务里的call方法的返回值,该方法让程序最多阻塞timeout和unit指定的时间,如果经过指定时间后Callable任 务依然没有返回值,将会抛出TimeoutException,其他与上面的get()方法用法一样。
        D、boolean isCancelled():如果在Callable任务正常完成前被取消,则返回true。
        E、boolean isDone():如果Callable任务已经完成,则返回true,而且这里要注意,如果任务正常终止、异常或取消,那么都将会返回true.
        关于Future的使用,其实重点并不在于我们对它的方法到底有多么熟悉,因为我们完全可以通过查找文档来了解它们的用法,那么我们需要掌握的是什么呢? 就是通过利用Future,我们可以做到什么?它解决的主要问题到底是什么?这些都是有利于我们对它的掌握。很多人都喜欢研究接口的内部实现,是的,这个 很重要,因为想要了解接口的实现,知道它的实现细节是非常重要的,只要知道它的实现细节,那么我上面的问题其实也就可以马上得到答案。但是我并不是什么大 师级人物,所以像是这种枯燥的东西完全没有信心可以讲得通俗易懂,自己没有晕都不错了!所以,就只能通过一些用例及其代码来研究研究,如果是非要知道底细 的读者,还请自己详细阅读一下相关文档。
    转自:http://www.cnblogs.com/wenjiang/archive/2012/09/02/2668089.html
  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/ihanliu/p/4451143.html
Copyright © 2011-2022 走看看