美文网首页
Scala编程基础30:Scala多线程

Scala编程基础30:Scala多线程

作者: 金字塔下的小蜗牛 | 来源:发表于2020-04-09 08:15 被阅读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() 它导致当前执行的线程对象临时暂停并允许其他线程执行。

    相关文章

      网友评论

          本文标题:Scala编程基础30:Scala多线程

          本文链接:https://www.haomeiwen.com/subject/whekdhtx.html