java future 设计模式_高阶多线程设计模式:Future,不看你会后悔

说到多线程的future,百度 多线程 future,网上也有各式各样的例子,写的比我还要好,但是实在是这个模式或者说例子以及实用性太大了,我不得不拿出来讲,甚至在实际生产环境中也是可以用的.我呢,也是拿出网上的例子详细的讲一遍~~

看下面的图↓↓↓↓↓

444cbe1691be

传统下单流程.jpg

如上图,传统的订单下单流程,首先减商品库存,然后生成订单,然后生成订单详情,再通知短信等等,全部逻辑程序都是串行执行的.假如我们的系统特别'困难',减商品库存要1秒,生成订单要1秒,生成详情也要1秒,发送短信有可能要5秒,这里还不算查询商品的库存够不够下单等等,那么一系列的操作就要花很多时间.

那么引入多线程的future有什么好处呢?看下图↓↓↓↓↓↓↓

444cbe1691be

多线程future下单流程.jpg

看这图很简单,用户下单,future对象直接告诉你下单成功,返回给你一个假数据,同时自己偷偷的新建了一个或者几个线程处理其他业务逻辑,等逻辑处理完了,再返回一个正确的结果.

然后是上代码~~

public interface Data {

String getRequest();

}

public class RealData implements Data {

private String result;

public RealData(String request) {

System.out.println("根据" + request + "进行查询..,要花很久时间");

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("操作完毕,获取结果");

result = "查询结果";

}

public String getRequest() {

return result;

}

}

public class FutureData implements Data {

private RealData realData;

private boolean isReady = false;

public synchronized String getRequest() {

while (!isReady) {

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

return this.realData.getRequest();

}

public synchronized void setRealData(RealData realData) {

if (isReady) {

return;

}

this.realData = realData;

isReady = true;

notify();

}

}

public class FutureClient {

public Data request(final String request) {

final FutureData futureData = new FutureData();

new Thread(new Runnable() {

public void run() {

RealData realData = new RealData(request);

futureData.setRealData(realData);

}

}).start();

return futureData;

}

}

public class Main {

public static void main(String[] args) {

FutureClient fClient = new FutureClient();

Data data = fClient.request("hello,world");

System.out.println("请求发送成功...");

System.out.println("干其他的事情...");

String result = data.getRequest();

System.out.println(result);

}

}

一共5个类,刚开始看会有点懵逼,正常,我也是懵逼的,我到现在也还是懂了90%,为什么懂90%就敢讲,其实也差不多了~自己按照代码一个单词一个单词的教,自然就懂思想.就按照我贴的代码顺序我们一点一点看,这个模式很有意思的,真的能学到很多东西.

首先看这个接口Data,只有一个方法getRequest(),返回String字符串.

然后再看RealData这个类,实现了Data接口,首先他有构造函数,打印了两句话,然后中间sleep一下,做这个sleep我们可以想象成在处理业务逻辑.

接着再看FutureData这个类,也实现了Data接口.先看FutureData的getRequest()方法,这个方法先死循环判断boolean,如果isReady是true,就阻塞着,不然就返回RealData真的getRequest()方法(真实的结果).然后再看setRealData(),判断isReady,如果是ture,直接return,如果不是就赋值RealData,并修改isReady,然后notify()..

其实很好理解,不要看到synchronized,notify,wait就晕了,FutureData这个类干了啥,你想,wait什么?不就是等notify吗,如果没有notify,那我就得等着,等什么?还是等通知啊,只有通知了,那么我才能进行下去,进行下去什么?--->RealData.getRequset()啊,就是真实的数据,为什么要等?因为还在处理啊,只有真实的数据处理完了,然后通知,也就是说FutureData这个类的setRealData()只是起到通知的作用,再看setRealData()传入的是RealData对象,RealData干了啥事,不就是有个构造函数实现自己的业务吗,实现完了就可以通知!!还不懂,自己敲代码..结合我说的多读几遍,别被饶晕了~~~

最后看FutureClient 这个类,最简单了,返回futureData,偷偷开了线程,看到RealData realData = new RealData(request)没有?就是开始执行业务了,然后当FutureData这个类的setRealData(RealData realData)时就通知了..我现在都100%懂了~~~~~~~

最后Main方法就不说了~

打印结果↓↓↓↓↓↓

请求发送成功...

干其他的事情...

根据hello,world进行查询..,要花很久时间

操作完毕,获取结果

查询结果

第四句话和第五话是2秒后才出来的~~~~

上面的原理你可以不用懂,当然懂最好了,可以在面试官面前吹牛逼啊..future模式这么凶残,jdk也有实现的,在java.util.concurrent,又是concurrent,这个工具类真的是强大上代码,就不说了~

import java.util.concurrent.Callable;

public class RealData implements Callable {

private String Data;

public RealData(String Data) {

this.Data = Data;

}

public String call() throws Exception {

//利用sleep来表示任务处理

Thread.sleep(2000);

return "这是处理"+Data+"结果";

}

}

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.FutureTask;

public class Main {

public static void main(String[] args) throws Exception {

Long start = System.currentTimeMillis();

FutureTask futureTask = new FutureTask<>(new RealData("hello,world"));

ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(1);

newFixedThreadPool.submit(futureTask);

// 表示正在处理其他逻辑,或者业务

Thread.sleep(1000);

System.out.println("最后结果-->" + futureTask.get());

Long end = System.currentTimeMillis();

Long useTime = end - start;

System.out.println("程序运行了-->" + useTime + "毫秒");

}

}

最后奉上打印结果↓↓↓↓↓

最后结果-->这是处理hello,world结果

程序运行了-->2004毫秒

看2秒就执行完了..最好自己敲一遍~~~~~

有啥不懂的请加qq727865942,微信号 cto_zej,觉得是干货请打赏~~~~~~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值