《多线程系列二》不理解future怎么能有future?

举报
香菜聊游戏 发表于 2021/07/15 00:07:00 2021/07/15
【摘要】 《多线程系列二》不理解future怎么能有future? 目录 《多线程系列二》不理解future怎么能有future? 1、Future的类图结构,从整体上看下Future的结构 2、future的使用,说的再多都么什么用,来个例子悄悄怎么用的。 3、通俗理解 4、原理 5、总结 今天说下future,Future是一个interface,可以方便的用...

《多线程系列二》不理解future怎么能有future?

图片

目录

《多线程系列二》不理解future怎么能有future?

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

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

3、通俗理解

4、原理

5、总结


今天说下future,Future是一个interface,可以方便的用于异步结果的获取。

项目需求:每个游戏都有世界BOSS的功能,因为世界boss 是涉及所有的玩家的,为了控制多线程的复杂度,会启动一个单线程的线程池控制整个流程,但是玩家的消息线程又需要获得当前世界boss 的信息,所以就有需求从单线程中获取boss信息。怎么做呐?future就可以解决这个问题。下面一起理解future和使用future。

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

图片

图片

 

首先看下future接口的函数,共有5个方法。

get() 获取执行的结果,另外一个重载是有时间限制的get ,如果超时会有异常

isDone()  判断future 结果是否处理完成

cancel 取消任务

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


  
  1. package thread;
  2. import java.util.concurrent.ExecutionException;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.Future;
  6. /**
  7. * @author 香菜
  8. */
  9. public class FutureTest {
  10. private ExecutorService bossExecutor = Executors.newSingleThreadExecutor();
  11. public Future<Integer> getHpTask(Integer input) {
  12. return bossExecutor.submit(() -> {
  13. System.out.println("Calculating..." + input);
  14. Thread.sleep(1000);
  15. return input * input;
  16. });
  17. }
  18. public static void main(String[] args) throws ExecutionException, InterruptedException {
  19. Future<Integer> calculate = new FutureTest().getHpTask(100);
  20. System.out.println(calculate.get());
  21. System.out.println("Done");
  22. }
  23. }

3、通俗理解

future 就像是去买手抓饼,你把钱给老板之后,老板对你说我做好了之后会放在旁边的盘子里,而这个盘子就是future,你用isDone  判断盘子里是不是有你要的手抓饼,有的话你就拿走。当然你可以一直在那等着 get(),或者去做其他的事情,等会再来拿。

4、原理

看下


  
  1. public V get() throws InterruptedException, ExecutionException {
  2.       int s = state;
  3.       if (s <= COMPLETING)
  4.           s = awaitDone(false, 0L);
  5.       return report(s);
  6.   }
  7.   private int awaitDone(boolean timed, long nanos)
  8.       throws InterruptedException {
  9.       final long deadline = timed ? System.nanoTime() + nanos : 0L;
  10.       WaitNode q = null;
  11.       boolean queued = false;
  12.       for (;;) {
  13.           if (Thread.interrupted()) {
  14.               removeWaiter(q);
  15.               throw new InterruptedException();
  16.           }
  17.           int s = state;
  18.           if (s > COMPLETING) {
  19.               if (q != null)
  20.                   q.thread = null;
  21.               return s;
  22.           }
  23.           else if (s == COMPLETING) // cannot time out yet
  24.               Thread.yield();
  25.           else if (q == null)
  26.               q = new WaitNode();
  27.           else if (!queued)
  28.               queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
  29.                                                     q.next = waiters, q);
  30.           else if (timed) {
  31.               nanos = deadline - System.nanoTime();
  32.               if (nanos <= 0L) {
  33.                   removeWaiter(q);
  34.                   return state;
  35.               }
  36.               LockSupport.parkNanos(this, nanos);
  37.           }
  38.           else
  39.               LockSupport.park(this);
  40.       }
  41.   }

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

5、总结

future理解起来很简单,就是给你排个号,等下好了,我会把数据放进去,如果你愿意等就等着,不愿等就等会来拿,就是一种延时获取结果的方式。理解了很简单。

下次写什么还没定,总之最近会一直写多线程东西,做个总结。

打字不容易,点赞,转发,关注三连,谢谢大家,对了,关注我公众号:【香菜聊游戏】有更多福利哦。常规福利双手送上。

图片

《多线程系列一》线程是什么?怎么理解多线程!

学会这招,再也不用写重复代码了,Consumer你指的拥有!

文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/114682253

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。