A-A+
大话Future模式
说在前面的话
什么是Future 模式呢?对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。其实这个模式用的很多,比如浏览器下载图片的时候,刚开始是不是通过模糊的图片来代替最后的图片,等下载图片的线程下载完图片后在替换。
思想
实例
Main:系统启动,调用Client发出请求
- package com.ifcoding.future;
- public class Main {
- public static void main(String[] args) {
- //1. 创建client
- Client client = new Client();
- //2. client请求,得到FutureData
- Data data = client.request("name");
- System.out.println("请求完毕!");
- try {
- Thread.sleep(2000);
- } catch (Exception e) {
- }
- System.out.println("数据=" + data.getResult());
- }
- }
Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData
- package com.ifcoding.future;
- public class Client {
- public Data request(final String queryStr) {
- final FutureData future = new FutureData();
- new Thread(){
- @Override
- public void run() {
- RealData realdata = new RealData(queryStr);
- future.setRealData(realdata);
- }
- }.start();
- return future;
- }
- }
Data:返回数据的接口
- package com.ifcoding.future;
- public interface Data {
- public String getResult();
- }
FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData
- package com.ifcoding.future;
- public class FutureData implements Data {
- protected RealData realdata = null;
- protected boolean isReady = false;
- public synchronized void setRealData(RealData realdata) {
- if (isReady) {
- return;
- }
- this.realdata = realdata;
- isReady = true;
- notifyAll();
- }
- @Override
- public String getResult() {
- if (!isReady) {
- try {
- wait();
- } catch (Exception e) {
- }
- }
- return realdata.result;
- }
- }
RealData:真实数据,其构造是比较慢的
- package com.ifcoding.future;
- public class RealData implements Data{
- public final String result;
- public RealData(String queryStr) {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < 10; i++) {
- sb.append(queryStr + " ");
- try {
- Thread.sleep(100);
- } catch (Exception e) {
- }
- }
- result = sb.toString();//实际要获得数据
- }
- @Override
- public String getResult() {
- return result;
- }
- }