进程是应用程序的执行过程;线程是比进程更小的执行单位。一个进程可以包含多个线程。这些线程共享父进程的资源。线程比进程更轻量级,有了多线程就可以实现并行化,即同一时刻可以有多个程序同时执行。
Scala的多线程用于开发并行的Scala应用程序。Scala不提供用于创建线程的任何单独的库。可以通过Java中的Thread类或者Runnable接口来创建线程,两者提供了线程的具体实现。
1.Scala线程的生命周期
线程生命周期是线程开始和终止的时间跨度,包括新建、就绪、运行、终止、阻塞等几个状态阶段。线程类提供了各种方法来监视线程的状态。线程的各个状态之间的相互转换关系如下所示:
![](https://img.haomeiwen.com/i17634123/3a0f8c634076e20b.png)
1.1 新建(New)
这是线程生命周期的第一个阶段,新建线程之后就开始了线程生命周期的循环过程。
1.2 就绪(Runnable)
线程创建、启动、获得所需资源或者运行完一个时间片之后,就进入就绪状态,表示可以运行了。
1.3 运行(Running)
线程调度器选择了该线程时,该线程就看开始执行,处于运行状态。
1.4 阻塞(Blocked)
线程执行期间需要等待用户输入或者资源不足时,该线程就进入阻塞状态,表示不能运行,直到满足运行条件才切换到就绪状态。
1.5 终止(Terminated)
当线程执行完毕或者死亡时,该线程处于终止状态。
2.Scala线程的实现
Scala线程的实现有两种方式:Thread类或者Runnable接口。
2.1 使用Thread类实现Scala线程
以下示例演示了使用Thread类实现Scala线程的过程:ThreadExample.scala
class MyThread1 extends Thread {
override def run() {
println("This is a Scala thread by class Thread")
}
}
object ThreadExample {
def main(args:Array[String]) {
val t = new MyThread1()
t.start()
}
}
编译并执行以上代码,输出结果如下:
E:\Test>scalac ThreadExample.scala
E:\Test>scala ThreadExample
This is a Scala thread by class Thread
2.2使用Runnable接口实现Scala线程
以下示例演示了使用Runnable接口实现Scala线程:RunnableExample.scala
class MyThread2 extends Runnable {
override def run() {
println("This is a Scala thread by Interface Runnable")
}
}
object RunnableExample {
def main(args:Array[String]) {
val e = new MyThread2()
val t = new Thread(e)
t.start()
}
}
编译并执行以上代码,输出结果如下:
E:\Test>scalac RunnableExample.scala
E:\Test>scala RunnableExample
This is a Scala thread by Interface Runnable
3.Scala线程的方法
3.1Scala线程sleep()方法
sleep()方法用于在指定时间内休眠线程,以毫秒为单位作为时间参数:SleepExample.scala
class MyThread1 extends Thread {
override def run() {
for(i <- 0 to 5) {
println(i)
Thread.sleep(1000)
}
}
}
object SleepExample {
def main(args:Array[String]) {
val t1 = new MyThread1()
val t2 = new MyThread1()
t1.start()
t2.start()
}
}
编译并执行以上代码,输出结果如下:
E:\Test>scalac SleepExample.scala
E:\Test>scala SleepExample
0
0
1
1
2
2
3
3
4
4
5
5
3.2Scala线程join()方法
join()方法能保证当前线程运行完再执行其他线程:JoinExample.scala
class MyThread1 extends Thread {
override def run() {
for(i <- 0 to 5) {
println(i)
Thread.sleep(1000)
}
}
}
object SleepExample {
def main(args:Array[String]) {
val t1 = new MyThread1()
val t2 = new MyThread1()
t1.start()
t1.join()
t2.start()
}
}
编译并执行以上代码,输出结果如下:
E:\Test>scalac SleepExample.scala
E:\Test>scala SleepExample
0
1
2
3
4
5
0
1
2
3
4
5
3.3Scala线程的其他常用方法
下面是一些Scala 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() |
它导致当前执行的线程对象临时暂停并允许其他线程执行。 |
网友评论