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