Java之多线程中的Future模式

应用场景:线程A需要线程B的执行结果,但没必要一直等待线程B执行完,这个时候可以先拿到未来的Future对象,等线程B执行完再来取真实结果。

定义RealData真实数据类,其构造函数很慢,是用户最后需要使用的数据,

    static class RealData<T> {        protected T result;

public RealData(T result) {            this.result = result;        }

public T getResult() {            return result;        }    }

定义Future对象任务类,其是Future模式的关键,是真实数据RealData的代理,封装了获取RealData的等待过程。

public class FutureData<T> {    private static final UtilsLog lg = UtilsLog.getLogger(FutureData.class);    protected boolean isReady = false;    private RealData<T> realData = null;    private Object mutix = new Object();

public static FutureData request(final String request) {        lg.e("新建FutureData对象");        final FutureData future = new FutureData();        new Thread(new Runnable() {            @Override            public void run() {                UtilsThread.sleepIgnoreInteruptedException(5000);                lg.e("*************模拟耗时线程with time :5000******");                RealData realData = new RealData(request);                future.setRealData(realData);            }        }).start();        lg.e("返回新建的FutureData对象");        return future;    }

public T getResult() {        synchronized (mutix) {            while (!isReady) {                lg.e("getResult:before wait");                try {                    mutix.wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }                lg.e("getResult:after wait");            }            lg.e("getResult:" + realData.getResult().toString());            return realData.getResult();        }    }

public void setRealData(RealData<T> realData) {        lg.e("执行设置数据:setRealData");        if (this.isReady) {            return;        }        this.realData = realData;        this.isReady = true;        synchronized (mutix) {            mutix.notify();        }    }}

在业务层发起请求,并调用getResult方法等待返回任务执行结果。

FutureData futureData = FutureData.request("我要执行耗时任务");lg.e("bootUpTestFunction result:" + futureData.getResult());

运行结果如下所示,分析知getResult方法中若isReady=false则调用wait()锁定当前线程,直至setRealData中调用notify()后继续执行wait后的方法。

关于Object的wait以及notify的相关知识点,请查看Java之Object的wait与notify的方法解析

来自为知笔记(Wiz)

时间: 2024-08-05 06:56:53

Java之多线程中的Future模式的相关文章

Java之多线程中的Master-Worker模式

该模式的好处是,将大任务拆解成若干小任务并并行执行,从而提高系统吞吐量. 定义Worker进程,负责处理实际任务. /*具体工作对象*/static abstract class Worker<T, R> implements Runnable { private static final UtilsLog lg = UtilsLog.getLogger(Worker.class); protected Queue<T> workQueue;//持有Master的任务队列 prot

Java演示设计模式中的单件模式的代码

下边代码内容是关于Java演示设计模式中的单件模式的代码,应该是对小伙伴们有所用处. public class SimpleSingleton { private static SimpleSingleton singleInstance = new SimpleSingleton(); private SimpleSingleton() { } public static SimpleSingleton getInstance() { return singleInstance; } } 调用

14.Java中的Future模式

jdk1.7.0_79  本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了FutureTask,这不得不停止脚步将方向转向Java的Future模式. Future是并发编程中的一种设计模式,对于多线程来说,线程A需要等待线程B的结果,它没必要一直等待B,可以先拿到一个未来的Future,等B有了结果后再取真实的结果. ExecutorService executor = Executors.

Java 多线程中的Future

我们先来了解一下什么是Future Future模式是多线程开发中非常常见的一种设计模式.它的核心思想是异步调用.当我们需要执行一段复杂业务代码,可能要的时间很长,我们也许不是马上需要结果,那么这时候就可以把这个代码托管给Future让他慢慢处理, 我们继续做其他事情,等我什么时候需要用到的时候再来调这个结果. 可能有人会问那为什么不用Thread呢?很显然run方法是没有返回值的这时候就要用到Future. Future如何使用能够获取子线程运行的结果呢?在这里顺便提一下Callable接口,

Java中的Future模式原理自定义实现

摘要:Future模式类似于js中的ajax等,是一个异步获取数据的机制,这里我把自己的一些形象理解通过代码实现了一下.该机制可以形象的理解为:调用获取数据的方法,首先获得一个没有装数据的空箱子(这个箱子有获取数据和装载数据的机制),至于箱子中的数据是通过另开一个线程去获取的,隔一段时间之后,当我们想要获取箱子中的数据的时候,就直接从箱子中拿就行了,一般情况下,由于获取到箱子之后到我需要从箱子中拿取数据应该已经过了一段时间(因为做其他一些操作),正是这一段时间,数据通过其它线程已经 Future

java:并发编程-Callable与Future模式

自己对线程池的理解: coresize 3 maxsize 5 blockLinkedQuenue 3 当提交的任务在<=3时,创建三个线程干活 大于3时,把任务先加入阻塞式队列,当有空闲的核心线程便去执行他们,队列中的任务执行是实际运行的线程在复用执行 如果后面有提交了很多任务,队列都放不下了,就赶紧创建新的线程去执行他们,如果任务已经大于了>队列+最大线程数,没有能力干活了,只能崩塌了,抛出拒绝异常 一.合理配置线程池 CPU密集 CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU

多线程手写Future模式

future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 public interface Future<T> { T get() throws InterruptedException; } futureTask 类 public interface FutureTask<T> { T call(); } asyncFuture 类是fufure

Java线程池(Callable+Future模式)

Java通过Executors提供四种线程池 1)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. 2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. 3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行. 4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行

在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)

同步代码块和同步方法的区别:同步代码块可以传入任意对象,同步方法中 如果多个线程检查的都是一个新的对象,不同的同步锁对不同的线程不具有排他性,不能实现线程同步的效果,这时候线程同步就失效了. 两者的区别主要体现在同步锁上面.对于实例的同步方法,因为只能使用this来作为同步锁,如果一个类中需要使用到多个锁,为了避免锁的冲突,必然需要使用不同的对象,这时候同步方法不能满足需求,只能使用同步代码块(同步代码块可以传入任意对象): 有几个原则的:程序次序规则:一个线程内,代码的执行会按照程序书写的顺序