Future类型的连锁的运用
Future类型的连锁的运用:
- 洗脸
- 刷牙
- 吃早饭
- 看电视
- 出门
串行:
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类型的连锁的运用的更多相关文章
- Java线程(七):Callable和Future
转自:http://blog.csdn.net/ghsau/article/details/7451464 本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. C ...
- Callable接口、Runable接口、Future接口
1. Callable与Runable区别 Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理.Thread类.Runnable接口和Java内存管理模型使得多线 ...
- java并发:获取线程执行结果(Callable、Future、FutureTask)
初识Callable and Future 在编码时,我们可以通过继承Thread或是实现Runnable接口来创建线程,但是这两种方式都存在一个缺陷:在执行完任务之后无法获取执行结果.如果需要获取执 ...
- 【Java线程】Callable和Future
Future模式 Future接口是Java线程Future模式的实现,可以来进行异步计算. Future模式可以这样来描述: 我有一个任务,提交给了Future,Future替我完成这个任务.期间我 ...
- Runnable、Callable、Future和FutureTask用法
http://www.cnblogs.com/dolphin0520/p/3949310.html java 1.5以前创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable ...
- java并发编程--Runnable Callable及Future
1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合Execu ...
- Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask
1. 引子 初学Java多线程,常使用Thread与Runnable创建.启动线程.如下例: Thread t1 = new Thread(new Runnable() { @Override pub ...
- SDP(13): Scala.Future - far from completion,绝不能用来做甩手掌柜
在前面几篇关于数据库引擎的讨论里很多的运算函数都返回了scala.Future类型的结果,因为我以为这样就可以很方便的实现了non-blocking效果.无论任何复杂的数据处理操作,只要把它们包在一个 ...
- Future学习
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. Callable接口类似于Runnable,从名字就可以看出来了,但 ...
随机推荐
- JMeter简介及使用JMeter来访问网站
参考: http://jmeter.apache.org/ http://blog.chinaunix.net/uid-26884465-id-3416869.html http://www.ltes ...
- STL中的map和multimap小结
(1)使用map/multimap之前必须包含头文件<map>:#include<map> 并且和所有的关联式容器一样,map/multimap通常以平衡二叉树来完成 ( ...
- 牛客小白月赛8 - E - 诡异数字 数位DP
牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...
- 关于Math常用的方法
1. 常用的Math用法 Math.random() //0-1 的随机数 Math.round() //四舍五入取整 Math.ceil() //向上取整 Math.floor() //向下取整 M ...
- Java内部类的使用小结 形参为什么要用final
部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文 ...
- 带你深入了解NPM——NPM初学者指南
前段时间,我们邀请了我们“城内”(葡萄城)资深开发工程师刘涛为大家分享了一次干货满满的关于Electron线上公开课,在课程过程中有不少同学对于NPM的概念和用法有一些疑问,所以这次我们希望通过这篇文 ...
- Mybatis系列(二)配置
Mybatis系列(二)配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configu ...
- Mybatis 分页查询
该篇博客记录采用pagehelper分页插件实现Mybatis分页功能 一.依赖 pom.xml <!-- pagehelper --> <dependency> <gr ...
- 面试常见问题:java中wait()和sleep()方法的区别
wait()和sleep()方法都是用来控制多线程的有力工具,那么它们之间有什么巨大的区别呢? 1.wait()方法是属于Object类的,而sleep()方法是属于Thread类的. 2.最重要的一 ...
- JSP官方文档(JavaServer Pages Specification)下载
找了好久,终于找到官网的下载地址了.这样,就可以用一手的文档资料了! 下载地址:http://download.oracle.com/otndocs/jcp/jsp-2_3-mrel2-spec/ s ...