futuretask源码解析-java开发java经验技巧

futuretask源码解析-java开发java经验技巧

ID:30778903

大小:91.00 KB

页数:12页

时间:2019-01-03

futuretask源码解析-java开发java经验技巧_第1页
futuretask源码解析-java开发java经验技巧_第2页
futuretask源码解析-java开发java经验技巧_第3页
futuretask源码解析-java开发java经验技巧_第4页
futuretask源码解析-java开发java经验技巧_第5页
资源描述:

《futuretask源码解析-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、FuturcTask源码解析-Java开发Java经验技巧FutureTask源码解析原文出处:Jd刘钳洋站在使用者的角度,future是一个经常在多线程环境下使用的Runnable,使用它的好处有两个:1.线程执行结果带有返I叫值2.提供了一个线程超时的功能,超过超时时间抛出界常后返回。那,怎么实现future这种超时控制呢?来看看代码:publicclassFutureTaskimplementsRunnableFuture{/**SynchronizationcontrolforFuturcTask*/privatefi

2、nalSyncsync;FutureTask的实现只是依赖了一个内部类Sync实现的,Sync是AQS(AbstractQueuedSynchronizer)的子类,这个类承担了所有future的功能,AbstractQueuedSynchronizer的作者是大名鼎鼎的并发编程大师DougLea,它的作用远远不止实现一个Future这么简单,后面在说。下面,我们从一个future提交到线程池开始,直到future超时或者执行结束来看看future都做了些什么。怎么做的。首先,向线程池ThreadPoolExecutor提交一个futur

3、e:future二exec,submit(newWebDivideFuture(cookieUti1s,jediusUti1,request,sclcctFactory,result,tcstlnfos));ThreadPoolExecutor将提交的任务用FutureTask包装一下:publicFuturesubmit(Callabletask){if(task二二null)thrownewNullPointerException();RunnableFutureftask二newTaskFor(task);e

4、xecute(ftask);returnftask;}protectedRunnableFuturenewTaskFor(Callablecallable){returnnewFuturcTask(callable);然后尝试将包装后的Future用Thread类包装下后启动,红色标记的地方表示,当当前线程池的大小小于corePoolSize时,将任务捉交,否则将该任务加入到workQueue中去,如果workQueue装满了,则尝试在线程数小于MaxPoolSize的条件下提交该任务。顺便说明下,我们使用线程池时

5、,常常看到有关有界队列,无界队列作为工作队列的字眼:使用无界队列时,线程池的大小永远不大于corePoolSize,使用有界队列时的maxPoolSize才有效,原因就在这里,如果是无界队列,红框中的add永远为true下方的addlfUnderMaximumPoolSize怎么也走不到了,也就不会有线程数量大于MaxPoolSize的情况。言归正传,看看add!FUnderCorePoolSize中做了什么事:new了一个Thread,将我们提交的任务包装下后就直接启动了privateboolcanaddlfUndcrCorcPoolS

6、izc(RunnablefirstTask){Threadt=null;finalReentrantLockmainLock=this.mainLock;mainLock,lock();try{if(poolsizc

7、,因此不难猜测FutureTask也是实现了Runnable接口的publicclassFutureTaskimplementsRunndbleFuture〈V>{/**SynchronizationcontrolforFutureTask*/publicinterfaceRunnableFutureextendsRunnable,Future{???/**????*SetsthisFuturetotheresultofitscomputation????*unlessithasbeencancelled.????*/?

8、??voidrun();FutureTask的run()方法i

9、【是这么写:publicvoidrun(){sync,inncrRun();innerRun方法先使用原子方式更改了一下自己的一

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。