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

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

wKiom1la-XfzTou1AAEW73xPJpo922.png-wh_50

新状态:线程对象已经创建,还没有在其上调用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"

  }


}

本文转自  ChinaUnicom110  51CTO博客,原文链接:http://blog.51cto.com/xingyue2011/1944344

相关文章
|
2月前
|
Java 开发者 Kotlin
华为仓颉语言初识:并发编程之线程的基本使用
本文详细介绍了仓颉语言中线程的基本使用,包括线程创建(通过`spawn`关键字)、线程名称设置、线程执行控制(使用`get`方法阻塞主线程以获取子线程结果)以及线程取消(通过`cancel()`方法)。文章还指出仓颉线程与Java等语言的差异,例如默认不提供线程名称。掌握这些内容有助于开发者高效处理并发任务,提升程序性能。
109 2
|
2月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
2月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
4月前
|
缓存 NoSQL 中间件
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
115 6
|
5月前
|
存储 缓存 关系型数据库
MySQL底层概述—3.InnoDB线程模型
InnoDB存储引擎采用多线程模型,包含多个后台线程以处理不同任务。主要线程包括:IO Thread负责读写数据页和日志;Purge Thread回收已提交事务的undo日志;Page Cleaner Thread刷新脏页并清理redo日志;Master Thread调度其他线程,定时刷新脏页、回收undo日志、写入redo日志和合并写缓冲。各线程协同工作,确保数据一致性和高效性能。
MySQL底层概述—3.InnoDB线程模型
|
6月前
|
安全 Java 程序员
面试直击:并发编程三要素+线程安全全攻略!
并发编程三要素为原子性、可见性和有序性,确保多线程操作的一致性和安全性。Java 中通过 `synchronized`、`Lock`、`volatile`、原子类和线程安全集合等机制保障线程安全。掌握这些概念和工具,能有效解决并发问题,编写高效稳定的多线程程序。
182 11
|
8月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
731 6
|
8月前
|
设计模式 安全 Java
Java 多线程并发编程
Java多线程并发编程是指在Java程序中使用多个线程同时执行,以提高程序的运行效率和响应速度。通过合理管理和调度线程,可以充分利用多核处理器资源,实现高效的任务处理。本内容将介绍Java多线程的基础概念、实现方式及常见问题解决方法。
313 1
|
9月前
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
8月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####