带你快速搞定java多线程(2)
目录
- 1、Future的类图结构,从整体上看下Future的结构
- 2、future的使用,说的再多都么什么用,来个例子悄悄怎么用的。
- 3、通俗理解
- 4、原理
- 5、总结
1、Future的类图结构,从整体上看下Future的结构
![带你快速搞定java多线程(2)](https://img.it610.com/image/info11/97c0c82afad34fd6b5e955f67d5dcaf2.jpg)
文章图片
![带你快速搞定java多线程(2)](https://img.it610.com/image/info11/a81b0d92c1f0437d875bb3b5fd1dadba.jpg)
文章图片
【带你快速搞定java多线程(2)】 首先看下future接口的函数,共有5个方法。
get() 获取执行的结果,另外一个重载是有时间限制的get ,如果超时会有异常
isDone() 判断future 结果是否处理完成
cancel 取消任务
2、future的使用,说的再多都么什么用,来个例子悄悄怎么用的。
package thread; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /*** @author 香菜*/public class FutureTest {private ExecutorService bossExecutor = Executors.newSingleThreadExecutor(); public FuturegetHpTask(Integer input) {return bossExecutor.submit(() -> {System.out.println("Calculating..." + input); Thread.sleep(1000); return input * input; }); }public static void main(String[] args) throws ExecutionException, InterruptedException {Future calculate = new FutureTest().getHpTask(100); System.out.println(calculate.get()); System.out.println("Done"); }}
3、通俗理解 future 就像是去买手抓饼,你把钱给老板之后,老板对你说我做好了之后会放在旁边的盘子里,而这个盘子就是future,你用isDone 判断盘子里是不是有你要的手抓饼,有的话你就拿走。当然你可以一直在那等着 get(),或者去做其他的事情,等会再来拿。
4、原理 看下
public V get() throws InterruptedException, ExecutionException {int s = state; if (s <= COMPLETING)s = awaitDone(false, 0L); return report(s); }private int awaitDone(boolean timed, long nanos)throws InterruptedException {final long deadline = timed ? System.nanoTime() + nanos : 0L; WaitNode q = null; boolean queued = false; for (; ; ) {if (Thread.interrupted()) {removeWaiter(q); throw new InterruptedException(); }int s = state; if (s > COMPLETING) {if (q != null)q.thread = null; return s; }else if (s == COMPLETING) // cannot time out yetThread.yield(); else if (q == null)q = new WaitNode(); else if (!queued)queued = UNSAFE.compareAndSwapObject(this, waitersOffset,q.next = waiters, q); else if (timed) {nanos = deadline - System.nanoTime(); if (nanos <= 0L) {removeWaiter(q); return state; }LockSupport.parkNanos(this, nanos); }elseLockSupport.park(this); }}
看下上面的代码就是在获取结果的时候,会先判断状态是否完成,如果完成了就正常返回结果,如果没完成就会调用awaitDone,看名字也能看出来就是等待直到完成,进入代码可以看到就是将进入死循环检查状态,线程阻塞等待,直到完成。要你写你是不是也会这样写?
5、总结 本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- 不废话,代码实践带你掌握|不废话,代码实践带你掌握 强缓存、协商缓存!
- 生发知识,带你深入了解
- 带你了解类型系统以及flow和typescript的基本使用
- neo4j|neo4j cql语句 快速查询手册
- 带你来看花
- 通过复盘快速成长(附模板)
- 5|5 个 PPT 常用快捷键带你从此走向高效
- jar|springboot项目打成jar包和war包,并部署(快速打包部署)
- 快速阅读作业【2/21】《阅读(革命性新定义》)
- Spring注解05|Spring注解05 @Import 给容器快速导入一个组件