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. P2698 [USACO12MAR]花盆Flowerpot 单调队列

    https://www.luogu.org/problemnew/show/P2698 警示 用数组写双端队列的话,记得le = 1, ri = 0:le<=ri表示队列非空 题意 求一个最小的 ...

  2. hdu6312 2018杭电多校第二场 1004 D Game 博弈

    Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. CodeForces 980 C Posterized

    Posterized 题意:将[0,255] 分成 若干段, 每一段的长度最多为k, 每一个数只能被放进一个段里, 然后每一段的数组都可以被这一段最小的数字表示, 求最小的字典序. 题解:每次一个访问 ...

  4. hdu 1176免费馅饼(记忆化搜索)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1176 题意不解释了 简单的记忆化搜索可以拿来练练手,注意要从pos = 5 开始搜索 #include ...

  5. 基于LinkedhashMap实现的LRU算法

    LRU全称是Least Recently Used,即最近最久未使用的意思.LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已存 ...

  6. Java微服务(一):dubbo-admin控制台的使用

    1.环境准备 使用CentOS7+Docker+Zookeeper3.4.10搭建dubbo微服务 1.1.安装docker容器 (1).uname -r:docker要求CentOS的内核版本高于3 ...

  7. DataReader转换

    public static partial class Extension { private static ConcurrentDictionary<Type, ConcurrentDicti ...

  8. 解决php中文乱码的两种方法

    第一种是添加html标签变为如下格式: <html> <head> <meta http-equiv="Content-Type" content=& ...

  9. sql 多行、一行 互转

    原始数据: 期望数据: IF OBJECT_ID('temp_20170701','u') IS NOT NULL DROP TABLE temp_20170701 CREATE TABLE temp ...

  10. 简单说一下你对http和https的理解

    http是一种超文本传输协议,传输的数据都是未加密的,也就是显示在明面上的,是现在互联网上应用最为广泛的一种网络协议,相对来说不太安全,但是所需成本很小.http一般的端口号为80. https则是具 ...