码迷,mamicode.com
首页 > 其他好文 > 详细

Future类型的连锁的运用

时间:2018-01-28 13:52:00      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:flow   技术分享   传递   流程   .exe   string   size   contex   val   

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类型的连锁的运用

标签:flow   技术分享   传递   流程   .exe   string   size   contex   val   

原文地址:https://www.cnblogs.com/AK47Sonic/p/8370920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!