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

相关文章
|
人工智能 安全 调度
Python并发编程之线程同步详解
并发编程在Python中至关重要,线程同步确保多线程程序正确运行。本文详解线程同步机制,包括互斥锁、信号量、事件、条件变量和队列,探讨全局解释器锁(GIL)的影响及解决线程同步问题的最佳实践,如避免全局变量、使用线程安全数据结构、精细化锁的使用等。通过示例代码帮助开发者理解并提升多线程程序的性能与可靠性。
419 0
|
Java 开发者 Kotlin
华为仓颉语言初识:并发编程之线程的基本使用
本文详细介绍了仓颉语言中线程的基本使用,包括线程创建(通过`spawn`关键字)、线程名称设置、线程执行控制(使用`get`方法阻塞主线程以获取子线程结果)以及线程取消(通过`cancel()`方法)。文章还指出仓颉线程与Java等语言的差异,例如默认不提供线程名称。掌握这些内容有助于开发者高效处理并发任务,提升程序性能。
511 2
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
773 2
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
缓存 NoSQL 中间件
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
483 6
|
安全 Java 程序员
面试直击:并发编程三要素+线程安全全攻略!
并发编程三要素为原子性、可见性和有序性,确保多线程操作的一致性和安全性。Java 中通过 `synchronized`、`Lock`、`volatile`、原子类和线程安全集合等机制保障线程安全。掌握这些概念和工具,能有效解决并发问题,编写高效稳定的多线程程序。
649 11
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
剖析 Redis List 消息队列的三种消费线程模型
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
1065 6

热门文章

最新文章