游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Java并发编程CallableFuture和FutureT

  Java并发编程:Callable、Future和FutureTask
  在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。
  这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。
  如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。
  而自从Java1。5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
  今天我们就来讨论一下Callable、Future和FutureTask三个类的使用方法。以下是本文的目录大纲:
  一。Callable与Runnable
  二。Future
  三。FutureTask
  四。使用示例
  若有不正之处请多多谅解,并欢迎批评指正。
  请尊重作者劳动成果,转载请标明原文链接:
  http:www。cnblogs。comdolphin0520p3949310。html一。Callable与Runnable
  先说一下java。lang。Runnable吧,它是一个接口,在它里面只声明了一个run()方法:
  publicinterfaceRunnable{
  publicabstractvoidrun();
  }
  由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。
  Callable位于java。util。concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做call():
  publicinterfaceCallable{
  Computesaresult,orthrowsanexceptionifunabletodoso。
  returncomputedresult
  throwsExceptionifunabletocomputearesult
  Vcall()throwsException;
  }
  可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。
  那么怎么使用Callable呢?一般情况下是配合ExecutorService来使用的,在ExecutorService接口中声明了若干个submit方法的重载版本:
  Futuresubmit(Callabletask);
  Futuresubmit(Runnabletask,Tresult);
  Futurelt;?submit(Runnabletask);
  第一个submit方法里面的参数类型就是Callable。
  暂时只需要知道Callable一般是和ExecutorService配合来使用的,具体的使用方法讲在后面讲述。
  一般情况下我们使用第一个submit方法和第三个submit方法,第二个submit方法很少使用。二。Future
  Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
  Future类位于java。util。concurrent包下,它是一个接口:
  publicinterfaceFuture{
  booleancancel(booleanmayInterruptIfRunning);
  booleanisCancelled();
  booleanisDone();
  Vget()throwsInterruptedException,ExecutionException;
  Vget(longtimeout,TimeUnitunit)
  throwsInterruptedException,ExecutionException,TimeoutException;
  }
  在Future接口中声明了5个方法,下面依次解释每个方法的作用:cancel方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回true。isDone方法表示任务是否已经完成,若任务完成,则返回true;get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;get(longtimeout,TimeUnitunit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。
  也就是说Future提供了三种功能:
  1)判断任务是否完成;
  2)能够中断任务;
  3)能够获取任务执行结果。
  因为Future只是一个接口,所以是无法直接用来创建对象使用的,因此就有了下面的FutureTask。三。FutureTask
  我们先来看一下FutureTask的实现:
  publicclassFutureTaskimplementsRunnableFuture
  FutureTask类实现了RunnableFuture接口,我们看一下RunnableFuture接口的实现:
  nterfaceRunnableFutureextendsRunnable,Future{
  voidrun();
  }
  可以看出RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
  FutureTask提供了2个构造器:
  publicFutureTask(Callablecallable){
  }
  publicFutureTask(Runnablerunnable,Vresult){
  }
  事实上,FutureTask是Future接口的一个唯一实现类。四。使用示例
  1。使用CallableFuture获取执行结果
  publicclassTest{
  publicstaticvoidmain(String〔〕args){
  ExecutorServiceexecutorExecutors。newCachedThreadPool();
  TasktasknewTask();
  Futureresultexecutor。submit(task);
  executor。shutdown();
  try{
  Thread。sleep(1000);
  }catch(InterruptedExceptione1){
  e1。printStackTrace();
  }
  System。out。println(主线程在执行任务);
  try{
  System。out。println(task运行结果result。get());
  }catch(InterruptedExceptione){
  e。printStackTrace();
  }catch(ExecutionExceptione){
  e。printStackTrace();
  }
  System。out。println(所有任务执行完毕);
  }
  }
  classTaskimplementsCallable{
  Override
  publicIntegercall()throwsException{
  System。out。println(子线程在进行计算);
  Thread。sleep(3000);
  intsum0;
  for(inti0;i100;i)
  sumi;
  returnsum;
  }
  }
  执行结果:
  ViewCode
  2。使用CallableFutureTask获取执行结果
  publicclassTest{
  publicstaticvoidmain(String〔〕args){
  第一种方式
  ExecutorServiceexecutorExecutors。newCachedThreadPool();
  TasktasknewTask();
  FutureTaskfutureTasknewFutureTask(task);
  executor。submit(futureTask);
  executor。shutdown();
  第二种方式,注意这种方式和第一种方式效果是类似的,只不过一个使用的是ExecutorService,一个使用的是Thread
  TasktasknewTask();
  FutureTaskfutureTasknewFutureTask(task);
  ThreadthreadnewThread(futureTask);
  thread。start();
  try{
  Thread。sleep(1000);
  }catch(InterruptedExceptione1){
  e1。printStackTrace();
  }
  System。out。println(主线程在执行任务);
  try{
  System。out。println(task运行结果futureTask。get());
  }catch(InterruptedExceptione){
  e。printStackTrace();
  }catch(ExecutionExceptione){
  e。printStackTrace();
  }
  System。out。println(所有任务执行完毕);
  }
  }
  classTaskimplementsCallable{
  Override
  publicIntegercall()throwsException{
  System。out。println(子线程在进行计算);
  Thread。sleep(3000);
  intsum0;
  for(inti0;i100;i)
  sumi;
  returnsum;
  }
  }
  如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Futurelt;?形式类型、并返回null作为底层任务的结果

课文草教案范文教学目标:1、体会动作描写、神态描写、心理描写以及细节描写的表达作用。2、理解课文塑造了以周副主席为代表的老一代无产阶级革命家的高大形象。3、理清课文的线索,……惆怅的造句惆怅拼音【注音】:chouchang惆怅解释【意思】:伤感;失意。惆怅造句:1、鲍德温当年居住过的房子已经荒废,等待出售:看着这堆石头建筑,我们满……指读习惯的培养教学反思从本单元的学习情况来看,学生们的指读习惯较差,主要表现在:一、听读时,虽然我一再提醒、强调指读,可有些学生心不在焉,眼睛东张西望,胡乱指着。二、自己读课文时,手指着……关于教学设计方案9篇为了确定工作或事情顺利开展,预先制定方案是必不可少的,方案一般包括指导思想、主要目标、工作重点、实施步骤、政策措施、具体要求等项目。那么问题来了,方案应该怎么写?下面是小编精心……思品教案自觉遵守公共秩序教学目标认知:1知道一些常去的公共场所应遵守的公共秩序。2知道在公共场所应遵守公共秩序,遵守公共秩序是有道德的表现。3懂得遵守公共秩序是人们公共生活得以……牙齿总成员教案设计【活动目标】1、通过对故事的欣赏,初步使幼儿了解不同的牙齿有不同的功能,激发幼儿爱护牙齿的意识。2、知道刷牙的重要性,让幼儿养成天天刷牙的习惯。【活动准备】……苏教版四年级数学求大数目的近似数的教学片断及反思师:通过昨天晚上的预习,同学们都知道可以用四舍五入的方法求一个数的近似数。下面是某市2004年末全市人口情况统计:总计(人)男性(人)女性(人)9708894842……为学阅读问题设计一、文题是为学,文章为什么从天下事说起?(天下事包括人之为学,由天下事引出人之为学,将两者相提并论,有突出为学之意)二、文中两名吾欲之南海语气各有什么不同?各表现了……冷眼旁观造句冷眼旁观造句一语义说明:形容用冷静的眼光在旁观察。使用类别:用在静止旁观的表述上。冷眼旁观造句:01他先冷眼旁观,注视一切,准备伺机而动。02冷眼……蟋蟀的住宅阅读练习及答案蟋蟀的住宅(法布尔)居住在草地上的蟋蟀,差不多和蝉一样有名。它的出名不光由于它的歌唱,还由于它的住宅。别的昆虫大多在临时的隐蔽所藏身。它们的隐蔽所得来不费功夫,弃去……Module2Changeunit1whatwillibe?教学目标:1。语法目标:1)usingthefuturetensetotalkaboutfutureevents;2)……第五节ampnbsp生物的变异ampnbsp1ampnbsp五节生物的变异教学目标:举例说出生物变异的实例,探究生物变异的现象及原因,意识到应该科学地描述生物的变异现象。教学重、难点:举例说出生物变异的实例,探究生物变异的现象及原因。一……
工业互联网全产业链企业名录来源:大陆锦绣写在前面今天给大家整理一份工业互联网产业链全景图谱企业数字化顶层规划设计与总体方案(规划、设计、实施、评价)2021091460页智……武汉方舱医院10个场景曝光,跟人们想的不太一样?最近武汉方舱医院曝光让人意想不到的是:这里没有人们想象中过多的恐惧和消极,更多的是人们对生命的热爱和绝境生花的坚强!01hr武汉体育中心方舱医院,……新能源汽车老司机为比亚迪唐安装了车载神器,后排秒变娱乐天地大家好,我是比亚迪DM2。0新能源汽车车主,同时家里也坐拥两台比亚迪纯电汽车。对于新能源汽车的热爱一直没有间断过,平时没事的时候,自己喜欢瞎琢磨,尤其在出行的过程中,会根据自己……冲冲的造句冲冲拼音【注音】:chongchong冲冲解释【意思】:感情激动的样子:兴怒气。冲冲造句:1、他怒气冲冲地冲出了会议室。2、这位妇女怒气冲冲……2100元就能买原装iPhoneXR?网友要是原装机我直播吃今天有人发了几张图片,是一台iPhoneXR256GB,号称是原装机。但价格却低到离谱,只要2150元!是不是非常有诱惑力?当然这台iPhoneXR的成色非常棒,几乎看不……华为mate系列目前为止哪一部最好用?正在用Mate9回复〔呲牙〕必须是mate20Pro,本人是重度手机使用者,华为手机从最早的D2,到第一款指纹手机mate7,一直用到mate20Pro,中间同时用过苹果……看图编故事教案目标:1、通过幼儿自己的观察,尝试对抽象事物的想象,培养幼儿发散性思维的能力。2、通过游戏启发幼儿大胆的描述抽象事物的过程,发展语言表达能力。准备:由易到难的……制作彩球教学反思范文作者来源:黄家沟小学张娜3月中旬,我参加了高区综合实践优质课评比活动,本次活动,让我受益不少:1、放大范作,激发学生的制作兴趣。我出示了一个放大很多倍的彩球,在我的……六年级语文下册丹柯的故事的优秀教学设计教学目标:1、读懂课文内容,抓住人物的动作、语言、神态和心理描写等重点语句,揣摩人物的心情。2、学习本课的写作方法。3、激发学生对丹柯的敬佩和崇拜之情。学习丹……人教版五年级猴王出世教学设计范文知识与能力:学习生字词,能流利有感情地朗读课文。情感态度价值观:了解课文内容,感悟石猴勇敢顽强、无私无畏的个性特点。过程与方法:初步感受古典文学的语言特点,体会中国……高中语文陈情表说课稿ldquo;各位评委、老师大家好:我是26号,今天我说课的题目是《陈情表》。我说课的内容分为五部分:一、说教材《陈情表》是人教版高中语文第五册第二单元的自读课文。本……初二地理我国主要山脉教案教学目的1。了解山脉的概念,掌握我国主要山脉的名称及其分布。2。通过上述学习活动,培养学生了解和分析山脉特征的能力。3。通过介绍我国登山健儿攀登珠穆朗玛峰的动……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网