Scala多线程

多线程是同时执行多个线程的过程。 它允许您独立执行多个操作。可以通过使用多线程来实现多任务。线程是轻量级的子进程,占用较少的内存。多线程用于在Scala中开发并发应用程序。

Scala不提供用于创建线程的任何单独的库。如果您熟悉Java的多线程概念,那么将会了解到它与Scala语言本身的语法相似。

可以通过扩展Thread类或Runnable接口来创建线程。两者都提供了运行方法来提供具体的实现。

Scala线程生命周期

线程生命周期是线程开始和终止的时间跨度。它有各种各样的阶段,如新,可运行,终止,阻止等。线程类提供了各种方法来监视线程的状态。

Scala线程状态如下:

  • 新建(New)
  • 可运行(Runnable)
  • 运行(Running)
  • 不可运行(Non-Runnable - 阻塞)
  • 终止(Terminated)

1. 新建(New)

这是线程的第一个状态,在新线程开始之前。

2. 可运行(Runnable)

这是线程已经启动但是线程调度程序没有选择它作为正在运行的线程的状态。

3. 运行(Running)

如果线程调度程序选择了该线程,则该线程处于运行状态。

4. 不可运行(Non-Runnable - 阻塞)

这是线程仍然存在但由于等待输入或资源而无法运行的状态。

5. 终止(Terminated)

run()方法退出时,线程处于终止或死亡状态。

Scala线程实现

在Scala中,创建线程有两种方法:

  • 通过扩展Thread
  • 通过实现Runnable接口

通过扩展Thread类的Scala线程示例

以下示例扩展了Thread类并覆盖了run方法,start()方法用于启动线程。

  1. class ThreadExample extends Thread{
  2. override def run(){
  3. println("Thread is running?");
  4. }
  5. }
  6. object Demo{
  7. def main(args:Array[String]){
  8. var t = new ThreadExample()
  9. t.start()
  10. }
  11. }
Scala

将上面代码保存到源文件:Demo.scala中,使用以下命令编译并执行代码 -

  1. D:\software\scala-2.12.3\bin>scalac Demo.scala
  2. D:\software\scala-2.12.3\bin>scala Demo.scal
  3. Thread is running...
Shell

通过扩展Runnable接口的Scala线程示例

以下示例实现了Runnable接口并覆盖了run方法。 start()方法用于启动线程。

  1. class ThreadExample extends Runnable{
  2. override def run(){
  3. println("Thread is running...")
  4. }
  5. }
  6. object Demo{
  7. def main(args:Array[String]){
  8. var e = new ThreadExample()
  9. var t = new Thread(e)
  10. t.start()
  11. }
  12. }
Scala

将上面代码保存到源文件:Demo.scala中,使用以下命令编译并执行代码 -

  1. D:\software\scala-2.12.3\bin>scalac Demo.scala
  2. D:\software\scala-2.12.3\bin>scala Demo.scal
  3. Thread is running...

Scala线程方法

线程(Thread)类提供了各种方法来处理线程的状态。可以使用这些方法来控制线程的执行。

下表包含Thread类常用的方法 -

方法 描述
public final String getName() 它返回线程的名称。
public final int getPriority() 它返回线程的优先级。
public Thread.State getState() 它返回此线程的状态。该方法设计用于监视系统状态,不用于同步控制。
public final boolean isAlive() 它测试这个线程是否存活着。如果线程已经启动并且尚未死亡,则该线程仍然存在。
public final void join() throws InterruptedException 它等待线程死亡。
public void run() 如果使用单独的Runnable运行对象构建此线程,则调用Runnable对象的run()方法; 否则,此方法不执行任何操作并返回。
public final void setName(String name) 它用于设置线程名称。
public final void setPriority(int newPriority) 它用于设置线程的优先级。
public static void sleep(long millis) throws InterruptedException 它用于执行指定的毫秒数休眠线程。
public static void yield() 它导致当前执行的线程对象临时暂停并允许其他线程执行。

Scala Thread sleep()方法

sleep()方法用于在指定时间内休眠线程,以毫秒为单位作为时间参数。

  1. class ThreadExample extends Thread{
  2. override def run(){
  3. for(i<- 0 to 5){
  4. println(i)
  5. Thread.sleep(500)
  6. }
  7. }
  8. }
  9. object Demo{
  10. def main(args:Array[String]){
  11. var t1 = new ThreadExample()
  12. var t2 = new ThreadExample()
  13. t1.start()
  14. t2.start()
  15. }
  16. }
Scala

将上面代码保存到源文件:Demo.scala中,使用以下命令编译并执行代码 -

  1. D:\software\scala-2.12.3\bin>scalac Demo.scala
  2. D:\software\scala-2.12.3\bin>scala Demo.scal
  3. 0
  4. 0
  5. 1
  6. 1
  7. 2
  8. 2
  9. 3
  10. 3
  11. 4
  12. 4
  13. 5
  14. 5
Shell

Scala Thread join()示例

join()方法等待线程死机,换句话说,join()方法用于保持当前正在运行的线程的执行,直到指定的线程完成它的执行。

  1. class ThreadExample extends Thread{
  2. override def run(){
  3. for(i<- 0 to 5){
  4. println(i)
  5. Thread.sleep(500)
  6. }
  7. }
  8. }
  9. object MainObject{
  10. def main(args:Array[String]){
  11. var t1 = new ThreadExample()
  12. var t2 = new ThreadExample()
  13. var t3 = new ThreadExample()
  14. t1.start()
  15. t1.join()
  16. t2.start()
  17. t3.start()
  18. }
  19. }
Scala

将上面代码保存到源文件:Demo.scala中,使用以下命令编译并执行代码 -

  1. D:\software\scala-2.12.3\bin>scalac Demo.scala
  2. D:\software\scala-2.12.3\bin>scala Demo.scal
  3. 0
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. 0
  10. 0
  11. 1
  12. 1
  13. 2
  14. 2
  15. 3
  16. 3
  17. 4
  18. 4
  19. 5
  20. 5
Shell

Scala setName()方法示例

在以下示例中,正在设置和获取线程名称。

  1. class ThreadExample() extends Thread{
  2. override def run(){
  3. for(i<- 0 to 5){
  4. println(this.getName()+" - "+i)
  5. Thread.sleep(500)
  6. }
  7. }
  8. }
  9. object MainObject{
  10. def main(args:Array[String]){
  11. var t1 = new ThreadExample()
  12. var t2 = new ThreadExample()
  13. var t3 = new ThreadExample()
  14. t1.setName("First Thread")
  15. t2.setName("Second Thread")
  16. t1.start()
  17. t2.start()
  18. }
  19. }
Scala

将上面代码保存到源文件:Demo.scala中,使用以下命令编译并执行代码 -

  1. D:\software\scala-2.12.3\bin>scalac Demo.scala
  2. D:\software\scala-2.12.3\bin>scala Demo.scal
  3. First Thread - 0
  4. Second Thread - 0
  5. Second Thread - 1
  6. First Thread - 1
  7. Second Thread - 2
  8. First Thread - 2
  9. Second Thread - 3
  10. First Thread - 3
  11. Second Thread - 4
  12. First Thread - 4
  13. Second Thread - 5
  14. First Thread - 5
Shell

Scala线程优先级示例

可以使用其预定义的方法设置线程优先级,以下示例设置线程的优先级。

  1. class ThreadExample() extends Thread{
  2. override def run(){
  3. for(i<- 0 to 5){
  4. println(this.getName())
  5. println(this.getPriority())
  6. Thread.sleep(500)
  7. }
  8. }
  9. }
  10. object Demo{
  11. def main(args:Array[String]){
  12. var t1 = new ThreadExample()
  13. var t2 = new ThreadExample()
  14. t1.setName("First Thread")
  15. t2.setName("Second Thread")
  16. t1.setPriority(Thread.MIN_PRIORITY)
  17. t2.setPriority(Thread.MAX_PRIORITY)
  18. t1.start()
  19. t2.start()
  20. }
  21. }
Scala

将上面代码保存到源文件:Demo.scala中,使用以下命令编译并执行代码 -

  1. D:\software\scala-2.12.3\bin>scalac Demo.scala
  2. D:\software\scala-2.12.3\bin>scala Demo.scal
  3. First Thread
  4. Second Thread
  5. 10
  6. 1
  7. Second Thread
  8. 10
  9. First Thread
  10. 1
  11. Second Thread
  12. 10
  13. First Thread
  14. 1
  15. Second Thread
  16. 10
  17. First Thread
  18. 1
  19. Second Thread
  20. 10
  21. First Thread
  22. 1
  23. Second Thread
  24. 10
  25. First Thread
  26. 1
Shell

Scala线程多任务示例

以下示例通过使用多个线程来运行多个任务,这个例子说明了如何在Scala中实现多任务。

  1. class ThreadExample() extends Thread{
  2. override def run(){
  3. for(i<- 0 to 5){
  4. println(i)
  5. Thread.sleep(500)
  6. }
  7. }
  8. def task(){
  9. for(i<- 0 to 5){
  10. println(i)
  11. Thread.sleep(200)
  12. }
  13. }
  14. }
  15. object Demo{
  16. def main(args:Array[String]){
  17. var t1 = new ThreadExample()
  18. t1.start()
  19. t1.task()
  20. }
  21. }
Scala

将上面代码保存到源文件:Demo.scala中,使用以下命令编译并执行代码 -

  1. D:\software\scala-2.12.3\bin>scalac Demo.scala
  2. D:\software\scala-2.12.3\bin>scala Demo.scal
  3. First Thread
  4. 0
  5. 0
  6. 1
  7. 2
  8. 1
  9. 3
  10. 4
  11. 2
  12. 5
  13. 3
  14. 4
  15. 5
  1.  

Spark记录-Scala多线程的更多相关文章

  1. Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)

    object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...

  2. Spark记录-scala快速入门

    1.hello world程序 object HelloWorld { def main(args: Array[String]) { println("Hello,World!" ...

  3. Spark记录-Scala集合

    Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...

  4. Spark记录-Scala记录(基础程序例子)

    import scala.util.control._ object learnning { def main(args:Array[String]):Unit={ val n:Int=10 prin ...

  5. Spark记录-Scala shell命令

    1.scala shell命令 scala> :help All commands can be abbreviated, e.g., :he instead of :help. :edit & ...

  6. Spark记录-Scala数组/List/Map/Set

    import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...

  7. Spark记录-Scala语法基础

    参考:http://docs.scala-lang.org/cheatsheets/index.html.http://docs.scala-lang.org/.http://www.scala-la ...

  8. Spark记录-Scala函数

    Scala函数 Scala有函数和方法. Scala方法是一个具有名称和签名的类的一部分. Scala中的函数是一个可以分配给变量的完整对象. 函数定义可以出现在源文件中的任何位置. 不带参数的函数 ...

  9. Spark记录-Scala语句(运算符-if-for-while-try-模式匹配)

    Scala条件运算符 Scala条件运算符在下表中列出. 运算符 操作 描述 && 与 运算符左侧和右侧的值为true.仅当左侧为真时,右侧才被计算. || 或 左侧或右侧的至少一个值 ...

随机推荐

  1. 内幕:XX二手车直卖网,狗屁直卖网,我来揭开他们套路!

    转自:明锐论坛   我是一位花生二手车直卖网的离职员工.已离职了一段时间,现在在某家汽车4S店公司上班.过去了那么久,每当看到他们铺天盖地的广告,心里都像十五个水桶--七上八下.思索已久,我还是决定鼓 ...

  2. R实战 第八篇:重塑数据(reshape2)

    数据重塑通常使用reshape2包,reshape2包用于实现对宽数据及长数据之间的相互转换,由于reshape2包不在R的默认安装包列表中,在第一次使用之前,需要安装和引用: install.pac ...

  3. c++ Arx二次开发创建椭圆和样条曲线

    一.本节课程 c++ Arx二次开发创建椭圆和样条曲线 二.本节要讲解的知识点 1.如何应用C++ ARX二次开发创建椭圆(对AcDbEllipse类的构造函数的直接封装和根据外接矩形来创建椭圆) 2 ...

  4. mac osx 初次使用PHP环境搭建

    非常简单,一共2个步骤: Step1: 启动Apache mac osx 系统默认安装Apache服务. 首先打开terminal,输入: sudo apachectl start 如果需要输入密码, ...

  5. 20181023-3 每周例行报告(添加PSP)

    此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2100] 一.本周PSP表格 类型 任务 开始时间 结束时间 中断时间 净时 ...

  6. C++中清空缓冲区

    C++中标准输入cin有多种输入方式.. 这篇文章罗列的还是简要易懂的.C++输入cin详解...如果只是简单的使用cin>>的话,会单个token的读入.但是会忽略换行符,空格,制表符等 ...

  7. Beta阶段冲刺-3

    一. 每日会议 1. 照片 2. 昨日完成工作 3. 今日完成工作 4. 工作中遇到的困难 杨晨露:组内图表部分遇到了问题,他们的问题一出来,我就头疼了......因为要调整计划时间,所以我觉得我的困 ...

  8. linux终端FQ

    工具列表: shadowsocks - QT5 ss账号 proxychains 使用过程: 1.用shadowsocks - QT5登入ss,设置本机端口1080 2.proxychains的使用 ...

  9. 冒泡排序的C、C++实现

    一.冒泡排序 冒泡排序就是重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如数字从大到小.首字母从A到Z)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换, ...

  10. Docker(十八)-Docker配置DNS

    Linux系统配置DNS的时候有一个问题,就是你在/ect/resolv.conf文件中添加上nameserver XXX.XXX.XXX.XXX的时候,当时是生效的,但是机器重启之后就失效了,所以我 ...