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 程序员 调度
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
45 1
|
2月前
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
|
2月前
|
Java 开发者
解锁并发编程新姿势!深度揭秘AQS独占锁&ReentrantLock重入锁奥秘,Condition条件变量让你玩转线程协作,秒变并发大神!
【8月更文挑战第4天】AQS是Java并发编程的核心框架,为锁和同步器提供基础结构。ReentrantLock基于AQS实现可重入互斥锁,比`synchronized`更灵活,支持可中断锁获取及超时控制。通过维护计数器实现锁的重入性。Condition接口允许ReentrantLock创建多个条件变量,支持细粒度线程协作,超越了传统`wait`/`notify`机制,助力开发者构建高效可靠的并发应用。
77 0
|
25天前
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
69 20
剖析 Redis List 消息队列的三种消费线程模型
|
11天前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
|
25天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
14天前
|
并行计算 API 调度
探索Python中的并发编程:线程与进程的对比分析
【9月更文挑战第21天】本文深入探讨了Python中并发编程的核心概念,通过直观的代码示例和清晰的逻辑推理,引导读者理解线程与进程在解决并发问题时的不同应用场景。我们将从基础理论出发,逐步过渡到实际案例分析,旨在揭示Python并发模型的内在机制,并比较它们在执行效率、资源占用和适用场景方面的差异。文章不仅适合初学者构建并发编程的基础认识,同时也为有经验的开发者提供深度思考的视角。
|
2月前
|
数据采集 Java Python
Python并发编程:多线程(threading模块)
Python是一门强大的编程语言,提供了多种并发编程方式,其中多线程是非常重要的一种。本文将详细介绍Python的threading模块,包括其基本用法、线程同步、线程池等,最后附上一个综合详细的例子并输出运行结果。
|
2月前
|
数据采集 Java Python
Python并发编程:多线程(threading模块)
本文详细介绍了Python的threading模块,包括线程的创建、线程同步、线程池的使用,并通过多个示例展示了如何在实际项目中应用这些技术。通过学习这些内容,您应该能够熟练掌握Python中的多线程编程,提高编写并发程序的能力。 多线程编程可以显著提高程序的并发性能,但也带来了新的挑战和问题。在使用多线程时,需要注意避免死锁、限制共享资源的访问,并尽量使用线程池来管理和控制线程。
|
2月前
|
缓存 Java 数据处理
Java中的并发编程:解锁多线程的力量
在Java的世界里,并发编程是提升应用性能和响应能力的关键。本文将深入探讨Java的多线程机制,从基础概念到高级特性,逐步揭示如何有效利用并发来处理复杂任务。我们将一起探索线程的创建、同步、通信以及Java并发库中的工具类,带你领略并发编程的魅力。
下一篇
无影云桌面