带你快速搞定java多线程(2)

这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下

目录

1、Future的类图结构,从整体上看下Future的结构

2、future的使用,说的再多都么什么用,来个例子悄悄怎么用的。

3、通俗理解

4、原理

5、总结

1、Future的类图结构,从整体上看下Future的结构

首先看下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 Future getHpTask(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) { if (q != null) q.thread = null; return s; } else if (s == COMPLETING) // cannot time out yet Thread.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

看下上面的代码就是在获取结果的时候,会先判断状态是否完成,如果完成了就正常返回结果,如果没完成就会调用awaitDone,看名字也能看出来就是等待直到完成,进入代码可以看到就是将进入死循环检查状态,线程阻塞等待,直到完成。要你写你是不是也会这样写?

5、总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程之家的更多内容

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...