`
zhaolei415
  • 浏览: 166088 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDK1.5新特性--java.util.concurrent Future

阅读更多
有时候在实际应用中,某些操作很耗时,但又不是不可或缺的步骤。比如用网页浏览器浏览新闻时,最重要的是要显示文字内容,至于与新闻相匹配的图片就没有那么重要的,所以此时首先保证文字信息先显示,而图片信息会后显示,但又不能不显示,由于下载图片是一个耗时的操作,所以必须一开始就得下载。Java的并发库的Future类就可以满足这个要求。
Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future 接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。

Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果,也可以设置任务执行的超时时间。这个设置超时的方法就是实现Java程序执行超时的关键。

Future接口是一个泛型接口,严格的格式应该是Future<V>,其中V代表了Future执行的任务返回值的类型。 Future接口的方法介绍如下:

*boolean cancel (boolean mayInterruptIfRunning) 取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束
*boolean isCancelled () 任务是否已经取消,任务正常完成前将其取消,则返回 true
*boolean isDone () 任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true
*V get () throws InterruptedException, ExecutionException  等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException
*V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计算超时,将抛出TimeoutException
package concurrent;

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;

public class TestFutureTask {
  public static void main(String[] args)throws InterruptedException,
      ExecutionException {
	    final ExecutorService exec = Executors.newFixedThreadPool(5);
	    Callable<String> call = new Callable<String>() {
	      public String call() throws Exception {
	        Thread.sleep(1000 * 3);
	        return "Other less important but longtime things.";
	      }
	    };
	    Future<String> task = exec.submit(call);
	    //重要的事情
	    Thread.sleep(1000 * 3);
	    System.out.println("Let's do important things.");
	    //不重要的事情
	    String obj = task.get();
	    System.out.println(obj);
	    //关闭线程池
	    exec.shutdown();
  }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics