Scala编程基础30:Scala多线程

2020-04-09  本文已影响0人  金字塔下的小蜗牛

进程是应用程序的执行过程;线程是比进程更小的执行单位。一个进程可以包含多个线程。这些线程共享父进程的资源。线程比进程更轻量级,有了多线程就可以实现并行化,即同一时刻可以有多个程序同时执行。

Scala的多线程用于开发并行的Scala应用程序。Scala不提供用于创建线程的任何单独的库。可以通过Java中的Thread类或者Runnable接口来创建线程,两者提供了线程的具体实现。

1.Scala线程的生命周期

线程生命周期是线程开始和终止的时间跨度,包括新建、就绪、运行、终止、阻塞等几个状态阶段。线程类提供了各种方法来监视线程的状态。线程的各个状态之间的相互转换关系如下所示:

image

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() 它导致当前执行的线程对象临时暂停并允许其他线程执行。
上一篇下一篇

猜你喜欢

热点阅读