并行模式之Future模式

举报
西魏陶渊明 发表于 2022/09/25 04:06:14 2022/09/25
【摘要】 理论 所谓 future 模式就是将任务提交给后台线程,然后主线程继续进行其他任务,当调用任务返回数据的时候,如果任务还未返回就阻塞等待任务。 举个例子: 一个人上街买西瓜汁(5min)?和馒头(1min) 传统方式: 因为西瓜汁要榨所以要等待5分钟,而馒头是做好的不用等待,传统方式是:先买西瓜,就等5分钟,然后再买馒头。总共耗...

理论

所谓 future 模式就是将任务提交给后台线程,然后主线程继续进行其他任务,当调用任务返回数据的时候,如果任务还未返回就阻塞等待任务。

举个例子:

一个人上街买西瓜汁(5min)?和馒头(1min)

  • 传统方式:

因为西瓜汁要榨所以要等待5分钟,而馒头是做好的不用等待,传统方式是:先买西瓜,就等5分钟,然后再买馒头。总共耗时:5+1

  • Future模式:

让西瓜汁先做,然后自己去买馒头,回来,在等4分钟,也就是并行计算
总共耗时:5分钟

4279695-2422d2e214b1baf5.png

分析:为何会阻塞

原因就是变量等待被赋值,一直阻塞在某一行,那么如果不想被阻塞,那么当调用方法直接就返回,那么就不会被阻塞了。

于是我们将直接调用方法进行包装,当线程调用返回,会立即返回结果。当对结果进行处理的时候(判断这是数据是否已经返回,如过没有返回,那么久阻塞)才会真正被阻塞。

代码实现


  
  1. public interface Data {
  2. String getResult() throws InterruptedException;
  3. }

  
  1. public class RealData implements Data {
  2. protected String data;
  3. RealData(String data){
  4. this.data=data;
  5. }
  6. public String getResult() throws InterruptedException {
  7. return data;
  8. }
  9. }

  
  1. public class FutureData implements Data {
  2. RealData realData = null;
  3. boolean isReady = false;//是否已经准备好
  4. public synchronized void setRealData(RealData realData){
  5. //如果已经好了,就直接返回
  6. if (isReady){
  7. return;
  8. }
  9. this.realData=realData;
  10. isReady=true;
  11. notifyAll();//唤醒线程,准备返回参数
  12. }
  13. public String getResult() throws InterruptedException {
  14. //没有准备好久等待
  15. if (!isReady) {
  16. wait();
  17. }
  18. return realData.getResult();
  19. }
  20. }

JDK中如何实现

  • 1.集成Callable<String/Dto>
  • 2.重写call方法

  
  1. /**
  2. * @Package: com.future.built
  3. * @Description: 内置方法
  4. * 将任务交给线程去提交执行
  5. * @author: liuxin
  6. * @date: 2017/7/11 上午11:27
  7. */
  8. public class Main {
  9. public static void main(String[] args) throws Exception{
  10. FutureTask<String> future=new FutureTask<String>(new RealData("2"));
  11. ExecutorService executor = Executors.newFixedThreadPool(1);
  12. executor.submit(future);
  13. executor.shutdown();
  14. try {
  15. Thread.sleep(2000);
  16. } catch (Exception e) {
  17. }
  18. System.out.println(future.get());
  19. }
  20. }

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/102425309

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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