Future 模式

java多线程设计模式全部源码:

java多线程设计模式源码

类图

这里写图片描述

时序图

这里写图片描述

  • Main.java
public class Main {
    public static void main(String[] args) {
        Host host = new Host();
        //data1、data2、data3都是FutureData(即它的 content还没有生成)
        final IData data1 = host.handleRequest(30, 'a');
        final IData data2 = host.handleRequest(20, 'b');
        final IData data3 = host.handleRequest(10, 'c');

        new Thread() {
            @Override
            public void run() {
                System.out.println(data1.getContent());
            }

        }.start();
        new Thread() {
            @Override
            public void run() {

                System.out.println(data2.getContent());
            }

        }.start();
        new Thread() {
            @Override
            public void run() {
                System.out.println(data3.getContent());
            }
        }.start();
    }
}

Host.java

public class Host {
    public IData handleRequest(final int count, final char ch) {
        System.out.println(Thread.currentThread() +
             " request " + count + " " + ch + " begin!");
        //FutureData的content是从RealData取的
        final FutureData futureData = new FutureData();
        new Thread() {

            @Override
            public void run() {
                //真正生产content的地方
                RealData realData = new RealData(count, ch);
                futureData.setData(realData);
            }

        }.start();
        System.out.println(Thread.currentThread() +
             " request " + count + " " + ch + " end!");
        return futureData;
    }
}

FutureData.java

public class FutureData implements IData {
    private boolean mReady = false;
    private IData mReadData;
    public synchronized  void setData(IData data) {
        mReadData = data;
        mReady = true;
        notifyAll(); //唤醒的只是调用this.wait()的线程,而不是这个进程的所有线程!!
    }

    @Override
    public synchronized String getContent() {
        while(!mReady) {
            try {
                this.wait(); //只会被this.notify()或者this.notifyAll()唤醒,
                            //而不是该进程的其它线程唤醒
                System.out.println(Thread.currentThread().getName() + "hahah");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return mReadData.getContent();
    }

}

RealData.java

public class RealData implements IData {
    private String mContent;
    public RealData(int count, char ch) {
        char [] buffer = new char[count];
        for(int i = 0; i < count; ++i) {
            buffer[i] = ch;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        mContent = new String(buffer);
    }
    @Override
    public String getContent() {
        return mContent;
    }
}

结果图

这里写图片描述

升级版(用了concurrent包下的FutureTask和Callable接口)

类图(升级版)

这里写图片描述

时序图(升级版)

这里写图片描述

  • Main.java、RealData.java、IData.java代码和上面版本的相同,所以这里就不贴代码了。

  • FutureData.java

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class FutureData extends FutureTask<RealData> implements IData {
    public FutureData(Callable<RealData> callable) {
        super(callable);
    }
    private boolean mReady = false;
    private IData mReadData;
    @Override
    public String getContent() {
        String content = null;
        try {
            //get()可能会阻塞(直到上面的callable对象的call()执行完才会不阻塞)
            content = get().getContent(); 
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        return content;
    }
}
  • Host.java
import java.util.concurrent.Callable;

public class Host {
    public IData handleRequest(final int count, final char ch) {
        System.out.println(Thread.currentThread() + " request " + count + " " + ch + " begin!");
        final FutureData futureData = new FutureData(new Callable<RealData>() {
            @Override
            public RealData call() throws Exception {
                return new RealData(count, ch);
            }
        });
        new Thread(futureData).start();
        System.out.println(Thread.currentThread() + " request " + count + " " + ch + " end!");
        return futureData;
    }
}

效果图(和上面的版本一样)

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值