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()方法用于启动线程。

class ThreadExample extends Thread{
override def run(){
println("Thread is running?");
}
}
object Demo{
def main(args:Array[String]){
var t = new ThreadExample()
t.start()
}
}
Scala

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

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

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

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

class ThreadExample extends Runnable{
override def run(){
println("Thread is running...")
}
}
object Demo{
def main(args:Array[String]){
var e = new ThreadExample()
var t = new Thread(e)
t.start()
}
}
Scala

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

D:\software\scala-2.12.3\bin>scalac Demo.scala
D:\software\scala-2.12.3\bin>scala Demo.scal
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()方法用于在指定时间内休眠线程,以毫秒为单位作为时间参数。

class ThreadExample extends Thread{
override def run(){
for(i<- 0 to 5){
println(i)
Thread.sleep(500)
}
} } object Demo{
def main(args:Array[String]){
var t1 = new ThreadExample()
var t2 = new ThreadExample()
t1.start()
t2.start()
}
}
Scala

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

D:\software\scala-2.12.3\bin>scalac Demo.scala
D:\software\scala-2.12.3\bin>scala Demo.scal
0
0
1
1
2
2
3
3
4
4
5
5
Shell

Scala Thread join()示例

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

class ThreadExample extends Thread{
override def run(){
for(i<- 0 to 5){
println(i)
Thread.sleep(500)
}
} }
object MainObject{
def main(args:Array[String]){
var t1 = new ThreadExample()
var t2 = new ThreadExample()
var t3 = new ThreadExample()
t1.start()
t1.join()
t2.start()
t3.start()
}
}
Scala

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

D:\software\scala-2.12.3\bin>scalac Demo.scala
D:\software\scala-2.12.3\bin>scala Demo.scal
0
1
2
3
4
5
0
0
1
1
2
2
3
3
4
4
5
5
Shell

Scala setName()方法示例

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

class ThreadExample() extends Thread{
override def run(){
for(i<- 0 to 5){
println(this.getName()+" - "+i)
Thread.sleep(500)
}
}
} object MainObject{
def main(args:Array[String]){
var t1 = new ThreadExample()
var t2 = new ThreadExample()
var t3 = new ThreadExample()
t1.setName("First Thread")
t2.setName("Second Thread")
t1.start()
t2.start()
}
}
Scala

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

D:\software\scala-2.12.3\bin>scalac Demo.scala
D:\software\scala-2.12.3\bin>scala Demo.scal
First Thread - 0
Second Thread - 0
Second Thread - 1
First Thread - 1
Second Thread - 2
First Thread - 2
Second Thread - 3
First Thread - 3
Second Thread - 4
First Thread - 4
Second Thread - 5
First Thread - 5
Shell

Scala线程优先级示例

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

class ThreadExample() extends Thread{
override def run(){
for(i<- 0 to 5){
println(this.getName())
println(this.getPriority())
Thread.sleep(500)
}
}
}
object Demo{
def main(args:Array[String]){
var t1 = new ThreadExample()
var t2 = new ThreadExample()
t1.setName("First Thread")
t2.setName("Second Thread")
t1.setPriority(Thread.MIN_PRIORITY)
t2.setPriority(Thread.MAX_PRIORITY)
t1.start()
t2.start()
}
}
Scala

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

D:\software\scala-2.12.3\bin>scalac Demo.scala
D:\software\scala-2.12.3\bin>scala Demo.scal
First Thread
Second Thread
10
1
Second Thread
10
First Thread
1
Second Thread
10
First Thread
1
Second Thread
10
First Thread
1
Second Thread
10
First Thread
1
Second Thread
10
First Thread
1
Shell

Scala线程多任务示例

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

class ThreadExample() extends Thread{
override def run(){
for(i<- 0 to 5){
println(i)
Thread.sleep(500)
}
}
def task(){
for(i<- 0 to 5){
println(i)
Thread.sleep(200)
}
}
} object Demo{
def main(args:Array[String]){
var t1 = new ThreadExample()
t1.start()
t1.task()
}
}
Scala

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

D:\software\scala-2.12.3\bin>scalac Demo.scala
D:\software\scala-2.12.3\bin>scala Demo.scal
First Thread
0
0
1
2
1
3
4
2
5
3
4
5
 

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. 全面掌握IO(输入/输出流)

    File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...

  2. Monkey基本使用

    什么是 Monkey Monkey 是一个 Android 自动化测试小工具.主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash. Monkey 特点 顾名思义,Mon ...

  3. [讲座] Parallel Processing of Graphs

    Graph 本次学术前沿讲座由邵斌老师主讲,标题已经揭示了主题:Graph.1.5h的talk,听完自觉意犹未尽.本来以为是一节自己没接触过的图形学的talk,没想到讲的很多内容都跟自己学过的很多东西 ...

  4. struts2中的方法的调用

    转载:http://blog.csdn.net/hephec/article/details/41808585 在Struts2中方法调用概括起来主要有三种形式: 第一种方式:指定method属性 & ...

  5. cxgrid多选删除

    设置OptionsData选项中的Editing设为True,按着Shift和Ctrl可实现多选 SelectionChanged事件 For i:= 0 To cxGrid1DBTableView1 ...

  6. C语言入门:05.scanf函数

    一.变量的内存分析 1.字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”. (1)内存以“字节为单位”

  7. Python的文件读写

    目录 读文件 操作文件 读取内容 面试题的例子 写文件 操作模式 指针操作 字符编码 读文件 操作文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): 文件使用完毕后必 ...

  8. Python进阶-字符串格式化

    目录 前言 %格式化 str.format() f-Strings 特殊符号处理 前言 在 Python 3.6 之前,字符串格式化方法主要有两种: %格式化 str.format() 在Python ...

  9. 3分钟带你搞懂ES6 import 和 export

    如下语句是 default import: // B.js import A from './A' 且只在A存在 default export 时生效: // A.js export default ...

  10. Django_重装系统后无法使用 sqlite 数据库报错:com.intellij.execution.ExecutionException: Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC

     重装系统后无法使用 sqlite 数据库报错 报错 : com.intellij.execution.ExecutionException: Exception in thread "ma ...