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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"

  }


}


本文出自 “星月情缘” 博客,请务必保留此出处http://xuegodxingyue.blog.51cto.com/5989753/1944344

以上是关于scala多线程之actor并发编程模型的主要内容,如果未能解决你的问题,请参考以下文章

scala学习笔记-Actor(19)

Scala笔记整理:Actor和AKKA

Scala笔记整理:Actor和AKKA

《Scala 语言》Scala 中的 Actor 编程

Scala并发编程reactloop代码实战具体解释

[scala] akka actor编程