这篇文章主要讲解了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类的用法有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。