進(jìn)程是應(yīng)用程序的執(zhí)行過程;線程是比進(jìn)程更小的執(zhí)行單位凿将。一個(gè)進(jìn)程可以包含多個(gè)線程校套。這些線程共享父進(jìn)程的資源。線程比進(jìn)程更輕量級(jí)牧抵,有了多線程就可以實(shí)現(xiàn)并行化笛匙,即同一時(shí)刻可以有多個(gè)程序同時(shí)執(zhí)行。
Scala的多線程用于開發(fā)并行的Scala應(yīng)用程序犀变。Scala不提供用于創(chuàng)建線程的任何單獨(dú)的庫膳算。可以通過Java中的Thread類或者Runnable接口來創(chuàng)建線程弛作,兩者提供了線程的具體實(shí)現(xiàn)涕蜂。
1.Scala線程的生命周期
線程生命周期是線程開始和終止的時(shí)間跨度,包括新建映琳、就緒机隙、運(yùn)行、終止萨西、阻塞等幾個(gè)狀態(tài)階段有鹿。線程類提供了各種方法來監(jiān)視線程的狀態(tài)。線程的各個(gè)狀態(tài)之間的相互轉(zhuǎn)換關(guān)系如下所示:
1.1 新建(New)
這是線程生命周期的第一個(gè)階段谎脯,新建線程之后就開始了線程生命周期的循環(huán)過程葱跋。
1.2 就緒(Runnable)
線程創(chuàng)建、啟動(dòng)源梭、獲得所需資源或者運(yùn)行完一個(gè)時(shí)間片之后娱俺,就進(jìn)入就緒狀態(tài),表示可以運(yùn)行了废麻。
1.3 運(yùn)行(Running)
線程調(diào)度器選擇了該線程時(shí)荠卷,該線程就看開始執(zhí)行,處于運(yùn)行狀態(tài)烛愧。
1.4 阻塞(Blocked)
線程執(zhí)行期間需要等待用戶輸入或者資源不足時(shí)油宜,該線程就進(jìn)入阻塞狀態(tài)掂碱,表示不能運(yùn)行,直到滿足運(yùn)行條件才切換到就緒狀態(tài)慎冤。
1.5 終止(Terminated)
當(dāng)線程執(zhí)行完畢或者死亡時(shí)疼燥,該線程處于終止?fàn)顟B(tài)。
2.Scala線程的實(shí)現(xiàn)
Scala線程的實(shí)現(xiàn)有兩種方式:Thread類或者Runnable接口蚁堤。
2.1 使用Thread類實(shí)現(xiàn)Scala線程
以下示例演示了使用Thread類實(shí)現(xiàn)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()
}
}
編譯并執(zhí)行以上代碼醉者,輸出結(jié)果如下:
E:\Test>scalac ThreadExample.scala
E:\Test>scala ThreadExample
This is a Scala thread by class Thread
2.2使用Runnable接口實(shí)現(xiàn)Scala線程
以下示例演示了使用Runnable接口實(shí)現(xiàn)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()
}
}
編譯并執(zhí)行以上代碼,輸出結(jié)果如下:
E:\Test>scalac RunnableExample.scala
E:\Test>scala RunnableExample
This is a Scala thread by Interface Runnable
3.Scala線程的方法
3.1Scala線程sleep()方法
sleep()方法用于在指定時(shí)間內(nèi)休眠線程违寿,以毫秒為單位作為時(shí)間參數(shù):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()
}
}
編譯并執(zhí)行以上代碼湃交,輸出結(jié)果如下:
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()方法能保證當(dāng)前線程運(yùn)行完再執(zhí)行其他線程: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()
}
}
編譯并執(zhí)行以上代碼,輸出結(jié)果如下:
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() |
它返回線程的優(yōu)先級(jí)搞莺。 |
public Thread.State getState() |
它返回此線程的狀態(tài)。該方法設(shè)計(jì)用于監(jiān)視系統(tǒng)狀態(tài)掂咒,不用于同步控制才沧。 |
public final boolean isAlive() |
它測(cè)試這個(gè)線程是否存活著。如果線程已經(jīng)啟動(dòng)并且尚未死亡绍刮,則該線程仍然存在温圆。 |
public final void join() throws InterruptedException |
它等待線程死亡。 |
public void run() |
如果使用單獨(dú)的Runnable 運(yùn)行對(duì)象構(gòu)建此線程孩革,則調(diào)用Runnable 對(duì)象的run() 方法; 否則岁歉,此方法不執(zhí)行任何操作并返回。 |
public final void setName(String name) |
它用于設(shè)置線程名稱膝蜈。 |
public final void setPriority(int newPriority) |
它用于設(shè)置線程的優(yōu)先級(jí)锅移。 |
public static void sleep(long millis) throws InterruptedException |
它用于執(zhí)行指定的毫秒數(shù)休眠線程。 |
public static void yield() |
它導(dǎo)致當(dāng)前執(zhí)行的線程對(duì)象臨時(shí)暫停并允許其他線程執(zhí)行饱搏。 |