欢迎来到天天文库
浏览记录
ID:30777749
大小:78.00 KB
页数:5页
时间:2019-01-03
《java多线程之异步future机制的原理和实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java多线程之异步Future机制的原理和实现这篇文章主要为大家详细介绍了Java多线程乙界步Future机制的原理和实现,感兴趣的小伙伴们可以参考一下项目中经常有些任务需要异步(提交到线程池屮)去执彳亍,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?川runnable是无法实现的,我们需要用callable看下面的代码:importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.Ex
2、ecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;publicclassAddTaskimplementsCallable{privateinta,b;publicAddTask(inta,intb){this.a=a;this.b=b;}@OverridepublicIntegercallthrowsException{Integerresult=a+b;returnresult;}publicstaticvoidma
3、in(String[]args)throwsInterruptedException,ExecutionException{ExecutorServiceexecutor=Executors.newSingleThreadExecutor;//JDK目前为止返冋的都是FutureTask的实例Futurefuture=executor.submit(newAddTask(l,2));Integerresult=future.get;//只有当future的状态是已完成时(future.isDone=true),get方法才会返回}}虽然可
4、以实现获取异步执行结果的需求,但是我们发现这个Future其实很不好用,因为它没有提供通知的机制,也就是说我们不知道future什么时候完成(如果我们需要轮询isDone()來判断的话感觉就没冇用这个的必要了)。看下java.util.concurrent.future.Future的接口方法:publicinterfaceFuture{booleancancel(booleanmaylnterruptlfRunning);booleanisCancelled;booleanisDone;VgetthrowsInterruptedException,
5、ExecutionException;Vget(longtimeout,TimeUnitunit)throwsInterruptedException,ExecutionException,TimeoutException;}由此可见JDK的Future机制其实并不好用,如果能给这个future加个监听器,让它在完成时通知监听器的话就比较好用了,就像下面这个(Future:packagefuture;importjava.util.concurrent.CancellationException;importjava.util.concurrent・Fut
6、ure;importjava.util.concurrent.TimeUnit;/***Theresultofanasynchronousoperation.**@authorlixiaohui*@param执行结果的类型参数*/publicinterfaceIFutureextendsFuture{booleanisSuccess;//是否成功VgetNow;〃立即返回结果(不管Future是否处于完成状态)Throwablecause;〃若执行失败时的原因booleanisCancellable;//是否可以取消IFuturea
7、waitthrowsInterruptedException;〃等待future的完成booleanawait(longtimeoutMillis)throwsInterruptedException;//超时等待future白勺;丘成booleanawaitflongtimeout,TimeUnittimeunit)throwsInterruptedException;IFutureawaitUninterruptibly;//等待future的完成,不响应中断booleanawaitUninterruptibly(longtimeoutMilli
8、s);〃超时等待future的完成,不响应中断booleanawa
此文档下载收益归作者所有