Spark記錄-Scala多線程

Scala多線程

多線程是同時執行多個線程的過程。 它容許您獨立執行多個操做。能夠經過使用多線程來實現多任務。線程是輕量級的子進程,佔用較少的內存。多線程用於在Scala中開發併發應用程序。shell

Scala不提供用於建立線程的任何單獨的庫。若是您熟悉Java的多線程概念,那麼將會了解到它與Scala語言自己的語法類似。多線程

能夠經過擴展Thread類或Runnable接口來建立線程。二者都提供了運行方法來提供具體的實現。併發

Scala線程生命週期

線程生命週期是線程開始和終止的時間跨度。它有各類各樣的階段,如新,可運行,終止,阻止等。線程類提供了各類方法來監視線程的狀態。ide

Scala線程狀態以下:測試

  • 新建(New)
  • 可運行(Runnable)
  • 運行(Running)
  • 不可運行(Non-Runnable - 阻塞)
  • 終止(Terminated)

1. 新建(New)ui

這是線程的第一個狀態,在新線程開始以前。this

2. 可運行(Runnable)spa

這是線程已經啓動可是線程調度程序沒有選擇它做爲正在運行的線程的狀態。線程

3. 運行(Running)scala

若是線程調度程序選擇了該線程,則該線程處於運行狀態。

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() } } 
Scala

將上面代碼保存到源文件: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...
Shell

經過擴展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() } } 
Scala

將上面代碼保存到源文件: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() } } 
Scala

將上面代碼保存到源文件: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
Shell

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() } } 
Scala

將上面代碼保存到源文件: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
Shell

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() } } 
Scala

將上面代碼保存到源文件: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
Shell

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() } } 
Scala

將上面代碼保存到源文件: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
Shell

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() } } 
Scala

將上面代碼保存到源文件: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
相關文章
相關標籤/搜索