scala多线程之actor并发编程模型

首先描述一下线程的状态。
线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞;

新状态:线程对象已经创建,还没有在其上调用start()方法。

2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。

3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。

4、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。

5、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

在scala中,没有线程的概念。用actor代替线程。

在2.10.x版本中,actor类已被废弃。

代码案例

import scala.actors.Actor

/**
  * desc: scala的Actor的使用
  */
//子线程1
class MyActor1 extends Actor {

  val ty = "MyActor1"

  override def act(): Unit = {
    for (i <- 1 to 100) {
      println(s"i=$i")
      println(s"MyActor1_Thread_ID:---${Thread.currentThread().getId}")
      println(s"MyActor1_Thread_Name:---${Thread.currentThread().getName}")
      Thread.sleep(2000)
    }
  }

}

//子线程2
class MyActor2 extends Actor {

  val ty = "MyActor2"

  override def act(): Unit = {
    for (i <- 1 to 100) {
      println(s"i=$i")
      println(s"MyActor2_Thread_ID:---${Thread.currentThread().getId}")
      println(s"MyActor2_Thread_Name:---${Thread.currentThread().getName}")
      Thread.sleep(2000)
    }
  }

}

object Demo01MyActor {

  def forTest(): Unit = {
    for (i <- 1 to 50) {
      println(s"forTest:$i")
      Thread.sleep(500)
    }
  }

  //主线程
  def main(args: Array[String]) {
    val actor1 = new MyActor1 //新建Actor
    actor1.start() //Actor进入就绪状态

    Demo01MyActor.forTest() //主线程调用一个循环(模拟然主线程进入堵塞状态)

    val actor2 = new MyActor2 //新建Actor
    actor2.start() //Actor进入就绪状态

    println(s"main_Thread_ID:---${Thread.currentThread().getId}")
    println(s"main_Thread_Name:---${Thread.currentThread().getName}")

  }

}

//子线程:MyActor

class MyActor extends Actor {

override def act(): Unit = {

while (true) {

receive({

case "starting" => {

println("Actor is start to do anything!")

//可以在这地方写子线程的业务逻辑操作

}

case "stoping" => {

println("Actor is stop to do anything!")

//在子线程想结束的时候,操作的部分

}

})

}

}

}

object Demo02ReceiveActor {

def main(args: Array[String]) {

val actor = new MyActor

actor.start()

println("MyActor is start")

actor ! "starting" //发送异步消息,没有返回值

actor ! "stoping" //发送异步消息,没有返回值

//循环的往子线程发送数据

for (i <- 1 to 5) actor ! "starting"

}

}

时间: 2024-10-06 00:15:17

scala多线程之actor并发编程模型的相关文章

Scala 学习 (七) 并发编程模型Akka

一,Akka简介 二,Akka中的Actor模型 三,Akka实战案例之HelloActor 四,Akka实战案例之PingPong 五,案例基于 Actor 的聊天模型 正文 一,Akka简介 写并发程序很难.程序员不得不处理线程.锁和竞态条件等等,这个过程很容易出错,而且会导致程序代码难以阅读.测试和维护.Akka 是 JVM 平台上构建高并发.分布式和容错应用的工具包和运行时.Akka 用 Scala 语言写成,同时提供了 Scala 和 JAVA 的开发接口 二,Akka中的Actor模

scala当中的Actor并发编程

注:Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃. 1.什么是Scala Actor Scala中的并发编程思想与Java中的并发编程思想完全不一样,Scala中的Actor是一种不共享数据,依赖于消息传递的一种并发编程模式, 避免了死锁.资源争夺等情况.在具体实现的过程中,Scala中的Actor会不断的循环自己的邮箱,并通过receive偏函数进行消息的模式匹

Java多线程-并发编程模型

以下内容转自http://ifeve.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E6%A8%A1%E5%9E%8B/: 并发系统可以采用多种并发编程模型来实现.并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业.不同的并发模型采用不同的方式拆分作业,同时线程间的协作和交互方式也不相同.这篇并发模型教程将会较深入地介绍目前(2015年,本文撰写时间)比较流行的几种并发模型. 并发模型与分布式系统之间的相似性 本文所描述的并发模型类似于分布式系统中使

4.并发编程模型

并发系统可以采用多种并发编程模型来实现.并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业.不同的并发模型采用不同的方式拆分作业,同时线程间的协作和交互方式也不相同.这篇并发模型教程将会较深入地介绍目前(2015年,本文撰写时间)比较流行的几种并发模型. 并发模型与分布式系统之间的相似性 本文所描述的并发模型类似于分布式系统中使用的很多体系结构.在并发系统中线程之间可以相互通信.在分布式系统中进程之间也可以相互通信(进程有可能在不同的机器中).线程和进程之间具有很多相似的特性.这也就是

大数据技术之_16_Scala学习_11_客户信息管理系统+并发编程模型 Akka+Akka 网络编程-小黄鸡客服案例+Akka 网络编程-Spark Master Worker 进程通讯项目

第十五章 客户信息管理系统15.1 项目的开发流程15.2 项目的需求分析15.3 项目的界面15.4 项目的设计-程序框架图15.5 项目的功能实现15.5.1 完成 Customer 类15.5.2 完成显示主菜单和退出软件功能15.5.3 完成显示客户列表的功能15.5.4 完成添加客户的功能15.5.5 完成删除客户的功能15.5.6 完善退出确认功能15.5.7 完善删除确认功能15.5.8 完成修改客户的功能第十六章 并发编程模型 Akka16.1 Akka 的介绍16.2 Acto

【专家坐堂】四种并发编程模型简介

本文来自网易云社区 概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" ?       并发 :同一时间 对待 多件事情 (逻辑层面) ?       并行 :同一时间 做(执行) 多件事情 (物理层面) 并发可以构造出一种问题解决方法,该方法能够被用于并行化,从而让原本只能串行处理的事务并行化,更好地发挥出当前多核CPU,分布式集群的能力. 但是,并发编程和人们正常的思维方式是不一样的,因此才有了各种编程模型的抽象来帮助我们更方便,更不容

程序员必知的七种并发编程模型

1.线程与锁线程与锁模型有很多众所周知的不足,但仍是其他模型的技术基础,也是很多并发软件开发的首选. 2.函数式编程 函数式编程日渐重要的原因之一,是其对并发编程和并行编程提供了良好的支持.函数式编程消除了可变状态,所以从根本上是线程安全的,而且易于并行执行. 3.Clojure之道——分离标识与状态 编程语言Clojure是一种指令式编程和函数式编程的混搭方案,在两种编程方式上取得了微妙的平衡来发挥两者的优势. 4.actor actor模型是一种适用性很广的并发编程模型,适用于共享内存模型和

IO复用、多进程和多线程三种并发编程模型

I/O复用模型 I/O复用原理:让应用程序可以同时对多个I/O端口进行监控以判断其上的操作是否可以进行,达到时间复用的目的.在书上看到一个例子来解释I/O的原理,我觉得很形象,如果用监控来自10根不同地方的水管(I/O端口)是否有水流到达(即是否可读),那么需要10个人(即10个线程或10处代码)来做这件事.如果利用某种技术(比如摄像头)把这10根水管的状态情况统一传达到某一点,那么就只需要1个人在那个点进行监控就行了,而类似与select或epoll这样的多路I/O复用机制就好比是摄像头的功能

基本的并发编程模型

基于进程的并发 基本模型 在TCP服务器编程中,多进程并发服务器通常由主进程负责连接的建立,然后fork出子进程,负责该连接剩下的行为,直到关闭. 关于多进程并发服务器有几点重要的内容: 通常服务器会运行很长时间,因此必须要包括一个SIGCHLD处理程序,来回收僵死子进程的资源.因为当SIGCHLD处理程序执行时,SIGCHLD信号是阻塞的,而Unix信号是不排队的,所以SIGCHLD处理程序必须准备好回收多个僵死子进程的资源. 父进程在fork调用后,将连接交给子进程处理,父子进程必须关闭他们