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() } }
將上面代碼保存到源文件: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...
通過擴展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() } }
將上面代碼保存到源文件: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() } }
將上面代碼保存到源文件: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
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() } }
將上面代碼保存到源文件: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
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() } }
將上面代碼保存到源文件: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
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() } }
將上面代碼保存到源文件: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
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() } }
將上面代碼保存到源文件: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