摘要:一定义模式用来获取线程的执行结果。案例中的类就是参与者参与者接受请求,然后创建线程进行异步处理。参与者会立即返回以的形式。虚拟数据参与者是用来统一代表参与者与参与者。
一、定义
Future模式用来获取线程的执行结果。在Thread-Per-Message模式中,如果调用一个线程异步执行任务,没有办法获取到返回值,就像:
host.request(10,"A");
而Future模式送出请求后,马上就要获取返回值,就像:
Data data=host.request(10,"A");
但是上述的返回值并不是程序的执行结果,因为线程是异步的,主线程调用该该方法时,异步线程可能才刚刚启动。需要一段时间后像下面这样获取执行结果:
data.getContent();
Data接口/实现:
public interface Data { public abstract String getContent(); }
public class RealData implements Data { private final String content; public RealData(int count, char c) { System.out.println(" making RealData(" + count + ", " + c + ") BEGIN"); char[] buffer = new char[count]; for (int i = 0; i < count; i++) { buffer[i] = c; try { Thread.sleep(100); } catch (InterruptedException e) { } } System.out.println(" making RealData(" + count + ", " + c + ") END"); this.content = new String(buffer); } public String getContent() { return content; } }
public class FutureData implements Data { private RealData realdata = null; private boolean ready = false; public synchronized void setRealData(RealData realdata) { if (ready) { return; } this.realdata = realdata; this.ready = true; notifyAll(); } public synchronized String getContent() { while (!ready) { try { wait(); } catch (InterruptedException e) { } } return realdata.getContent(); } }
Host类:
public class Host { public Data request(final int count, final char c) { System.out.println(" request(" + count + ", " + c + ") BEGIN"); final FutureData future = new FutureData(); new Thread() { public void run() { RealData realdata = new RealData(count, c); future.setRealData(realdata); } }.start(); System.out.println(" request(" + count + ", " + c + ") END"); return future; } }
执行:
public class Main { public static void main(String[] args) { System.out.println("main BEGIN"); Host host = new Host(); Data data1 = host.request(10, "A"); Data data2 = host.request(20, "B"); Data data3 = host.request(30, "C"); System.out.println("main otherJob BEGIN"); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println("main otherJob END"); System.out.println("data1 = " + data1.getContent()); System.out.println("data2 = " + data2.getContent()); System.out.println("data3 = " + data3.getContent()); System.out.println("main END"); } }三、模式讲解
Future模式的角色如下:
Client(委托人)参与者
Client参与者会向Host参与者送出请求(request),Client参与者会马上得到VirtualData,作为请求结果的返回值。(案例中的Main类就是Client)
Host参与者
Host参与者接受请求(request),然后创建线程进行异步处理。Host参与者会立即返回Future(以VirturalData的形式)。
VirtualData(虚拟数据)参与者
VirtualData是用来统一代表Future参与者与RealData参与者。(案例中Data接口就是VirtualData参与者)
RealData(实际数据)参与者
RealData表示实际的数据。
Future参与者
Future参与者包含获取实际的数据和设置实际数据的方法。Host类会创建该对象,当异步线程处理完成时,会调用Future的设置数据的方法。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71509.html
摘要:方法接受一个生产者作为参数,返回一个对象,该对象完成异步执行后会读取调用生产者方法的返回值。该方法接收一个对象构成的数组,返回由第一个执行完毕的对象的返回值构成的。 一、Future 接口 在Future中触发那些潜在耗时的操作把调用线程解放出来,让它能继续执行其他有价值的工作,不再需要呆呆等待耗时的操作完成。打个比方,你可以把它想象成这样的场景:你拿了一袋子衣服到你中意的干洗店去洗。...
摘要:中的的线程是以事件循环和消息队列的形式存在,包含两个任务队列,一个是内部队列,一个是外部队列,而的优先级又高于。同时还有处理按住时的事件额外处理,同时手势处理一般在的子类进行。谷歌大会之后,有不少人咨询了我 Flutter 相关的问题,其中有不少是和面试相关的,如今一些招聘上也开始罗列 Flutter 相关要求,最后想了想还是写一期总结吧,也算是 Flutter 的阶段复习。 ⚠️系统完...
摘要:组合式异步编程最近这些年,两种趋势不断地推动我们反思我们设计软件的方式。第章中介绍的分支合并框架以及并行流是实现并行处理的宝贵工具它们将一个操作切分为多个子操作,在多个不同的核甚至是机器上并行地执行这些子操作。 CompletableFuture:组合式异步编程 最近这些年,两种趋势不断地推动我们反思我们设计软件的方式。第一种趋势和应用运行的硬件平台相关,第二种趋势与应用程序的架构相关...
摘要:一和并发包中的和主要解决的是线程的互斥和同步问题,这两者的配合使用,相当于的使用。写锁与读锁之间互斥,一个线程在写时,不允许读操作。的注意事项不支持重入,即不可反复获取同一把锁。没有返回值,也就是说无法获取执行结果。 一、Lock 和 Condition Java 并发包中的 Lock 和 Condition 主要解决的是线程的互斥和同步问题,这两者的配合使用,相当于 synchron...
摘要:本文首发于一世流云的专栏一模式简介模式是多线程设计模式中的一种常见模式,它的主要作用就是异步地执行任务,并在需要的时候获取结果。二中的模式在多线程基础之模式中,我们曾经给出过模式的通用类关系图。 showImg(https://segmentfault.com/img/bVbiwcx?w=1000&h=667); 本文首发于一世流云的专栏:https://segmentfault.co...
阅读 1597·2021-11-02 14:42
阅读 492·2021-10-18 13:24
阅读 890·2021-10-12 10:12
阅读 1780·2021-09-02 15:41
阅读 3160·2019-08-30 15:56
阅读 2861·2019-08-29 16:09
阅读 2012·2019-08-29 11:13
阅读 3587·2019-08-28 18:06