首先描述一下线程的状态。 线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞;
新状态:线程对象已经创建,还没有在其上调用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"
}
}