欢迎来到天天文库
浏览记录
ID:30778903
大小:91.00 KB
页数:12页
时间:2019-01-03
《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(poolsizc7、,因此不难猜测FutureTask也是实现了Runnable接口的publicclassFutureTaskimplementsRunndbleFuture〈V>{/**SynchronizationcontrolforFutureTask*/publicinterfaceRunnableFutureextendsRunnable,Future{???/**????*SetsthisFuturetotheresultofitscomputation????*unlessithasbeencancelled.????*/?8、??voidrun();FutureTask的run()方法i9、【是这么写:publicvoidrun(){sync,inncrRun();innerRun方法先使用原子方式更改了一下自己的一
7、,因此不难猜测FutureTask也是实现了Runnable接口的publicclassFutureTaskimplementsRunndbleFuture〈V>{/**SynchronizationcontrolforFutureTask*/publicinterfaceRunnableFutureextendsRunnable,Future{???/**????*SetsthisFuturetotheresultofitscomputation????*unlessithasbeencancelled.????*/?
8、??voidrun();FutureTask的run()方法i
9、【是这么写:publicvoidrun(){sync,inncrRun();innerRun方法先使用原子方式更改了一下自己的一
此文档下载收益归作者所有