Java并发编程:Callable、Future和FutureTask_第1页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、java并发编程:callable、future和futuretask在前面的文章中我们叙述了创建线程的2种方式,一种是挺直继承thread,另外一种就是实现runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法猎取执行结果。假如需要猎取执行结果,就必需通过分享变量或者用法线程通信的方式来达到效果,这样用法起来就比较棘手。而自从java1.5开头,就提供了callable和future,通过它们可以在任务执行完毕之后得到任务执行结果。今日我们就来研究一下callable、future和futuretask三个类的用法办法。以下是本文的名目大纲:一.callable与runnab

2、le二.future三.futuretask四.用法示例一.callable与runnable先说一下java.lang.runnable吧,它是一个接口,在它里面只声明白一个run()办法:123 publicinterfacerunnablepublicabstractvoidrun();因为run()办法返回值为void类型,所以在执行完任务之后无法返回任何结果。callable位于java.util.concurrent包下,它也是一个接口,在它里面也只声明白一个办法,只不过这个办法叫做call():123456789 publicinterfacecallable/*computes

3、aresult,orthrowsanexceptionifunabletodoso.*returncomputedresult*throwsexceptionifunabletocomputearesult*/vcall()throwsexception;可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的v类型。那么怎么用法callable呢?普通状况下是协作executorservice来用法的,在executorservice接口中声明白若干个submit办法的重载版本:123 futuresubmit(callabletask);futuresubmit(runnabl

4、etask,tresult);futuresubmit(runnabletask);第一个submit办法里面的参数类型就是callable。临时只需要知道callable普通是和executorservice协作来用法的,详细的用法办法讲在后面叙述。普通状况下我们用法第一个submit办法和第三个submit办法,其次个submit办法很少用法。二.futurefuture就是对于详细的runnable或者callable任务的执行结果举行取消、查询是否完成、猎取结果。须要时可以通过get办法猎取执行结果,该办法会堵塞直到任务返回结果。future类位于java.util.concurren

5、t包下,它是一个接口:12345678 publicinterfacefuturebooleancancel(booleanmayinterruptifrunning);booleaniscancelled();booleanisdone();vget()throwsinterruptedexception,executionexception;vget(longtimeout,timeunitunit)throwsinterruptedexception,executionexception,timeoutexception;在future接口中声明白5个办法,下面依次说明每个办法的作用:c

6、ancel办法用来取消任务,假如取消任务胜利则返回true,假如取消任务失败则返回false。参数mayinterruptifrunning表示是否允许取消正在执行却没有执行完毕的任务,假如设置true,则表示可以取消正在执行过程中的任务。假如任务已经完成,则无论mayinterruptifrunning为true还是false,此办法绝对返回false,即假如取消已经完成的任务会返回false;假如任务正在执行,若mayinterruptifrunning设置为true,则返回true,若mayinterruptifrunning设置为false,则返回false;假如任务还没有执行,则无论

7、mayinterruptifrunning为true还是false,绝对返回true。iscancelled办法表示任务是否被取消胜利,假如在任务正常完成前被取消胜利,则返回true。isdone办法表示任务是否已经完成,若任务完成,则返回true;get()办法用来猎取执行结果,这个办法会产生堵塞,会向来等到任务执行完毕才返回;get(longtimeout,timeunitunit)用来猎取执行结果,假如在指定时光内,还没猎取到结果,就挺直返回null。也就是说future提供了三种功能:1)推断任务是否完成;2)能够中断任务;3)能够猎取任务执行结果。由于future只是一个接口,所以是

8、无法挺直用来创建对象用法的,因此就有了下面的futuretask。三.futuretask我们先来看一下futuretask的实现:1 publicclassfuturetaskimplementsrunnablefuturefuturetask类实现了runnablefuture接口,我们看一下runnablefuture接口的实现:123 publicinterfacerunnablefutureextendsrunnable,futurevoidrun();可以看出runnablefuture继承了runnable接口和future接口,而futuretask实现了runnablefut

9、ure接口。所以它既可以作为runnable被线程执行,又可以作为future得到callable的返回值。futuretask提供了2个构造器:1234 publicfuturetask(callablecallable)publicfuturetask(runnablerunnable,vresult)实际上,futuretask是future接口的一个唯一实现类。四.用法示例1.用法callable+future猎取执行结果12345678910111213141516171819202122232425262728293031323334353637 publicclasstestpu

10、blicstaticvoidmain(stringargs)executorserviceexecutor=executors.newcachedthreadpool();tasktask=newtask();futureresult=executor.submit(task);executor.shutdown();trythread.sleep(1000);catch(interruptedexceptione1)e1.printstacktrace();system.out.println("主线程在执行任务");trysystem.out.print

11、ln("task运行结果"+result.get();catch(interruptedexceptione)e.printstacktrace();catch(executionexceptione)e.printstacktrace();system.out.println("全部任务执行完毕");classtaskimplementscallableoverridepublicintegercall()throwsexceptionsystem.out.println("子线程在举行计算&q

12、uot;);thread.sleep(3000);intsum=0;for(inti=0;ifuturetask=newfuturetask(task);executor.submit(futuretask);executor.shutdown();/其次种方式,注重这种方式和第一种方式效果是类似的,只不过一个用法的是executorservice,一个用法的是thread/*tasktask=newtask();futuretaskfuturetask=newfuturetask(task);threadthread=newthread(futuretask);thread.start();

13、*/trythread.sleep(1000);catch(interruptedexceptione1)e1.printstacktrace();system.out.println("主线程在执行任务");trysystem.out.println("task运行结果"+futuretask.get();catch(interruptedexceptione)e.printstacktrace();catch(executionexceptione)e.printstacktrace();system.out.println("全部任务执行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论