初学scala3——使用future实现并发

future可以实现多线程并发,使用起来简单,但是效果很好,直接看代码吧

import java.text.SimpleDateFormat
import java.util.Date
import java.util.concurrent.TimeUnit

import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

object FutureTest {
  def main(args: Array[String]): Unit = {
    val results = Await.result(f4, 5 seconds)
    println("end: " + new SimpleDateFormat("hh:mm:ss:SSS").format(new Date()))
    println(results)
  }

  val f1 = Future {
    println("f1 executing " + new SimpleDateFormat("hh:mm:ss:SSS").format(new Date()))
    TimeUnit.SECONDS.sleep(1)
    "f1"
  }

  val f2 = Future {
    println("f2 executing " + new SimpleDateFormat("hh:mm:ss:SSS").format(new Date()))
    TimeUnit.SECONDS.sleep(2)
    "f2"
  }

  val f3 = Future {
    println("f3 executing " + new SimpleDateFormat("hh:mm:ss:SSS").format(new Date()))
    TimeUnit.SECONDS.sleep(3)
    "f3"
  }

  val f4: Future[Seq[String]] = Future.sequence(Seq(f1, f2, f3))
}

结果如下:

f1 executing 10:57:10:741
f3 executing 10:57:10:741
f2 executing 10:57:10:788
end: 10:57:13:760
List(f1, f2, f3)

f1、f2、f3同时启动,说明实现了多线程并发

时间: 2024-08-06 07:58:41

初学scala3——使用future实现并发的相关文章

java Future FutureTask 并发操作

1.1 综述 创建线程有两种方式:extends Thread || inplements Runable,但是这两种方式都有一个缺陷,就是执行完任务后不能获取执行结果. 如果非要获取到执行结果的话,就必须通过共享变量或者是线程通信的方法来达到效果,使用较为麻烦,为了解决这种问题,java提供了Callable Future ,通过他们可以再任务执行完毕后得到任务执行结果. 1.2 Runable Callable 对比 java.lang.Runable是一个接口,声明了run()方法: pu

【并发编程】Future模式及JDK中的实现

1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果:但有时我们可能并不急着需要其中某行的执行结果,想让被调用者立即返回.比如小明在某网站上成功创建了一个账号,创建完账号后会有邮件通知,如果在邮件通知时因某种原因耗时很久(此时账号已成功创建),使用传统同步执行的方式那就要等完这个时间才会有创建成功的结果返回到前端,但此时账号创建成功后我们并不需要立即关心邮件发送成功了没,此时就可以使用Fu

14.Java中的Future模式

jdk1.7.0_79  本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了FutureTask,这不得不停止脚步将方向转向Java的Future模式. Future是并发编程中的一种设计模式,对于多线程来说,线程A需要等待线程B的结果,它没必要一直等待B,可以先拿到一个未来的Future,等B有了结果后再取真实的结果. ExecutorService executor = Executors.

基于Actor的并发方案

共享可变状态的问题 Actor模型 Actor系统 定义Actor 消息处理 副作用 非类型化 异步和非阻塞 创建一个Actor 发送消息 消息应答 问询Ask机制 有状态的Actor 小结 译者注: 本文原文标题:<The Neophyte's Guide to Scala Part 14: The Actor Approach to Concurrency>,作者:Daniel Westheide, 原文链接:http://danielwestheide.com/blog/2013/02/

Scala中Future的线程数

为什么Future最大只有4个并发线程? 线程池中有多少个线程是由ExecutionContext决定的.如果使用的是默认的global,则只有4个并发线程. import scala.concurrent.ExecutionContext.Implicits.global 默认的global ExecutionContext在哪里设置的4个并发线程? global用的是ExecutionContextImpl,其中有这么一段代码: def createExecutorService: Exec

Java并发编程有多难?这几个核心技术你掌握了吗?

本文主要内容索引 1.Java线程 2.线程模型 3.Java线程池 4.Future(各种Future) 5.Fork/Join框架 6.volatile 7.CAS(原子操作) 8.AQS(并发同步框架) 9.synchronized(同步锁) 10.并发队列(阻塞队列) 本文仅分析java并发编程中的若干核心问题,对于上面没有提到但是又和java并发编程有密切关系的技术将会不断添加进来完善文章,本文将长期更新,不断迭代.本文试图从一个更高的视觉来总结Java语言中的并发编程内容,希望阅读完

干货:Java并发编程必懂知识点解析

本文大纲 并发编程三要素 原子性 原子,即一个不可再被分割的颗粒.在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性 程序执行的顺序按照代码的先后顺序执行.(处理器可能会对指令进行重排序) 可见性 当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值. 2. 线程的五大状态 创建状态 当用 new 操作符创建一个线程的时候 就绪状态 调用 start 方法,处于就绪状态的线程并不一定马上就会执行 run 方法,还需要等待CPU的调度

干货:Java并发编程必懂知识点解析(内附面试题)

本文大纲 1.并发编程三要素 原子性 原子,即一个不可再被分割的颗粒.在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性 程序执行的顺序按照代码的先后顺序执行.(处理器可能会对指令进行重排序) 可见性 当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值. 2. 线程的五大状态 创建状态 当用 new 操作符创建一个线程的时候 就绪状态 调用 start 方法,处于就绪状态的线程并不一定马上就会执行 run 方法,还需要等待CPU的

并发编程重要知识点

1.并发编程三要素 原子性 原子,即一个不可再被分割的颗粒.在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性 程序执行的顺序按照代码的先后顺序执行.(处理器可能会对指令进行重排序) 可见性 当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值. 2. 线程的五大状态 创建状态 当用 new 操作符创建一个线程的时候 就绪状态 调用 start 方法,处于就绪状态的线程并不一定马上就会执行 run 方法,还需要等待CPU的调度 运行