Java FutureTask类的用法

  介绍

这篇文章主要讲解了Java FutureTask类的用法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

FutureTask一个可取消的异步计算,FutureTask实现了未来的基本方法,提空开始取消操作,可以查询计算是否已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,得到方法会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。

一个FutureTask可以用来包装一个调用或是一个可运行的对象。因为FurtureTask实现了可运行的方法,所以一个FutureTask可以提交(提交)给一个Excutor执行(承办)。

FutureTask是java 5引入的一个类,从名字可以看出来FutureTask既是一个未来,又是一个任务。

我们看下FutureTask的定义:

公共类FutureTask实现RunnableFuture{
  …
  }
  公共接口RunnableFuture扩展了Runnable, Future{/* *
  *这未来计算的结果集
  *,除非它已被取消。
  */空运行();
  }

FutureTask实现了RunnableFuture接口,RunnableFuture接口是可运行和未来的综合体。

作为一个未来,FutureTask可以执行异步计算,可以查看异步程序是否执行完毕,并且可以开始和取消程序,并取得程序最终的执行结果。

除此之外,FutureTask还提供了一个runAndReset()的方法,该方法可以运行任务并且重置未来的状态。

可赎回和可运行的转换
我们知道可调用的是有返回值的,而运行的是没有返回值的。
执行人提供了很多有用的方法,将可转换为可调用:

公共静态& lt; T>Callable可调用(可运行任务,T结果){
  如果(任务==null)
  把新NullPointerException ();
  返回新RunnableAdapter(任务,结果);
  }

FutureTask内部包含一个可调用,并且可以接受可赎回和可作为构造函数:

公共FutureTask (Callable可调用){
  如果(可调用的==null)
  把新NullPointerException ();
  这一点。可调用=可调用的;
  这一点。状态=新;//确保调用的可见性
  }
  公共FutureTask (Runnable Runnable, V结果){
  这一点。可调用=执行人。可调用(可运行,结果);
  这一点。状态=新;//确保调用的可见性
  }

它的内部就是调用了执行人。可调用(可运行,结果);方法进行转换的。

以runnable运行

既然是一个可运行,那么FutureTask就可以以线程的方式执行,我们来看一个例子:

@Test   公共空间convertRunnableToCallable()抛出中InterruptedException {   FutureTaskfutureTask=new FutureTask<祝辞(新的Callable () {   @Override   公共整数调用()抛出异常{   log.info(“在未来可调用的任务…“);   返回0;   }   });      线程的线程=新线程(futureTask);   thread.start ();   .toString log.info (futureTask.get () ());   }

上面例子是以单个线程来执行的,同样我们也可以将FutureTask提交给线程池来执行:

 @Test
  公共空间workWithExecutorService()抛出中InterruptedException {
  FutureTaskfutureTask=new FutureTask<祝辞(新的Callable () {
  @Override
  公共整数调用()抛出异常{
  log.info (“futureTask"内);
  返回1;
  }
  });
  ExecutorService执行人=Executors.newCachedThreadPool ();
  executor.submit (futureTask);
  executor.shutdown ();
  .toString log.info (futureTask.get () ());
  }

看完上述内容,是不是对Java FutureTask类的用法有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。

Java FutureTask类的用法