Future类型的连锁的运用:

  1. 洗脸
  2. 刷牙
  3. 吃早饭
  4. 看电视
  5. 出门

串行:

import scala.concurrent.{Await, Future}
import scala.util.{Failure, Random, Success}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration object FutureDemo extends App { private def washFace: Future[String] = Future {
Thread.sleep(Random.nextInt(3000))
println(f"washFace Thread: ${Thread.currentThread().getName}")
println("I am washing face")
"washFace"
} private def brushTeeth: Future[String] = Future {
Thread.sleep(Random.nextInt(3000))
println(f"brushTeeth Thread: ${Thread.currentThread().getName}")
println("I am brushing teeth")
"brushTeeth"
} private def haveBreakfirst: Future[String] = Future {
Thread.sleep(Random.nextInt(3000))
println(f"haveBreakfirst Thread: ${Thread.currentThread().getName}")
println("I am having Breakfirst")
"haveBreakfirst"
} private def watchTV: Future[String] = Future {
Thread.sleep(Random.nextInt(3000))
println(f"watchTV Thread: ${Thread.currentThread().getName}")
println("I am watching TV")
"watchTV"
} private def leaveHome: Future[String] = Future {
Thread.sleep(Random.nextInt(3000))
println(f"leaveHome Thread: ${Thread.currentThread().getName}")
println("I leave Home")
"leaveHome"
} /**
* ******************** For *********************
*/
/**
* Serial
*/ val rs = for {
_ <- brushTeeth
_ <- washFace
_ <- haveBreakfirst
_ <- watchTV
_ <- leaveHome
} yield () Await.result(rs, Duration.Inf)
rs.onComplete({
case Success(x) => println(x)
case Failure(y) => println(y)
}) }

运行结果:

并发:(吃早饭和看电视可以同时进行,次序随机,其他步骤次序保持不变)

  /**
* Concurrent
*/
val rs = for {
_ <- brushTeeth
_ <- washFace
bf = haveBreakfirst
wt = watchTV
_ <- bf
_ <- wt
_ <- leaveHome
} yield ()

运行结果:

流程值传递:

package com.csl.concurrent

import scala.concurrent.{Await, Future}
import scala.util.{Failure, Random, Success}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration object FutureDemo extends App { /**
* Flow
*/ private def brushTeeth: Future[String] = Future {
Thread.sleep(Random.nextInt(3000))
println(f"brushTeeth Thread: ${Thread.currentThread().getName}")
println("I am brushing teeth")
"brushTeeth"
} private def washFace(x: String): Future[String] = Future {
Thread.sleep(Random.nextInt(3000))
println(f"washFace Thread: ${Thread.currentThread().getName}")
println("I am washing face")
x + "-> washFace"
} private def haveBreakfirst(x: String): Future[String] = Future {
// Thread.sleep(Random.nextInt(3000))
println(f"haveBreakfirst Thread: ${Thread.currentThread().getName}")
println("I am having Breakfirst")
x + "-> haveBreakfirst \n"
} private def watchTV(x: String): Future[String] = Future {
// Thread.sleep(Random.nextInt(3000))
println(f"watchTV Thread: ${Thread.currentThread().getName}")
println("I am watching TV")
x + "-> watchTV \n"
} private def leaveHome(x: String): Future[String] = Future {
Thread.sleep(Random.nextInt(3000))
println(f"leaveHome Thread: ${Thread.currentThread().getName}")
println("I leave Home")
x + "-> leaveHome"
} val rs = for {
btrs <- brushTeeth
wfrs <- washFace(btrs)
bf = haveBreakfirst(wfrs)
wt = watchTV(wfrs)
bfrs <- bf
wtrs <- wt
lhrs <- leaveHome(bfrs + wtrs)
} yield ("\n rs: \n" + lhrs) Await.result(rs, Duration.Inf)
rs.onComplete({
case Success(x) => println(x)
case Failure(y) => println(y)
}) }

运行结果:

Future类型的连锁的运用的更多相关文章

  1. Java线程(七):Callable和Future

    转自:http://blog.csdn.net/ghsau/article/details/7451464 本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. C ...

  2. Callable接口、Runable接口、Future接口

    1. Callable与Runable区别 Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理.Thread类.Runnable接口和Java内存管理模型使得多线 ...

  3. java并发:获取线程执行结果(Callable、Future、FutureTask)

    初识Callable and Future 在编码时,我们可以通过继承Thread或是实现Runnable接口来创建线程,但是这两种方式都存在一个缺陷:在执行完任务之后无法获取执行结果.如果需要获取执 ...

  4. 【Java线程】Callable和Future

    Future模式 Future接口是Java线程Future模式的实现,可以来进行异步计算. Future模式可以这样来描述: 我有一个任务,提交给了Future,Future替我完成这个任务.期间我 ...

  5. Runnable、Callable、Future和FutureTask用法

    http://www.cnblogs.com/dolphin0520/p/3949310.html java 1.5以前创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable ...

  6. java并发编程--Runnable Callable及Future

    1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合Execu ...

  7. Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

    1. 引子 初学Java多线程,常使用Thread与Runnable创建.启动线程.如下例: Thread t1 = new Thread(new Runnable() { @Override pub ...

  8. SDP(13): Scala.Future - far from completion,绝不能用来做甩手掌柜

    在前面几篇关于数据库引擎的讨论里很多的运算函数都返回了scala.Future类型的结果,因为我以为这样就可以很方便的实现了non-blocking效果.无论任何复杂的数据处理操作,只要把它们包在一个 ...

  9. Future学习

    接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果.        Callable接口类似于Runnable,从名字就可以看出来了,但 ...

随机推荐

  1. HDU2896病毒入侵AC_自动机

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  2. poj 1417 True Liars(并查集+背包dp)

    题目链接:http://poj.org/problem?id=1417 题意:就是给出n个问题有p1个好人,p2个坏人,问x,y是否是同类人,坏人只会说谎话,好人只会说实话. 最后问能否得出全部的好人 ...

  3. CodeM资格赛 优惠券

    [编程|1000分] 优惠券 时间限制:1秒空间限制:32768K 题目描述 美团点评上有很多餐馆优惠券,用户可以在美团点评App上购买.每种优惠券有一个唯一的正整数编号.每个人可以拥有多张优惠券,但 ...

  4. 基于SpringBoot从零构建博客网站 - 开发文章详情页面

    文章详情页面是博客系统中最为重要的页面,登录用户与游客都可以浏览文章详情页面,只不过只有登录用户才能进行其它的一些操作,比如评论.点赞和收藏等等. 本次的开发任务只是将文章详情页面展示出来,至于一些收 ...

  5. HDFS 读写流程-英

    HDFS 文件读取流程 The client opens the file it wishes to read by calling open() on the FileSystem object, ...

  6. 超实用!K8s 开发者必须知道的 6 个开源工具

    文章来源:云原生实验室,点击查看原文. 导读:Kubernetes 作为云原生时代的"操作系统",熟悉和使用它是每名用户(User)的必备技能.如果你正在 Kubernetes 上 ...

  7. Android Activity启动耗时统计方案

    作者:林基宗 Activity的启动速度是很多开发者关心的问题,当页面跳转耗时过长时,App就会给人一种非常笨重的感觉.在遇到某个页面启动过慢的时候,开发的第一直觉一般是onCreate执行速度太慢了 ...

  8. Python 的整数与 Numpy 的数据溢出

    某位 A 同学发了我一张截图,问为何结果中出现了负数? 看了图,我第一感觉就是数据溢出了.数据超出能表示的最大值,就会出现奇奇怪怪的结果. 然后,他继续发了张图,内容是 print(100000*20 ...

  9. 【LeetCode】103# 二叉树的锯齿形层次遍历

    题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], ...

  10. 6、二叉树树(java实现)

    1.创建树的节点 public class Node { public Object data; //存储数据 public Node leftChild; //左子树指针 public Node r ...