1. 程式人生 > >執行緒管理(一)執行緒的建立和執行

執行緒管理(一)執行緒的建立和執行

宣告:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷 校對:歐振聰

執行緒的建立和執行

在這個指南中,我們將學習如何在Java程式中建立和執行執行緒。與每個Java語言中的元素一樣,執行緒是物件。在Java中,我們有2個方式建立執行緒:

  • 通過直接繼承thread類,然後覆蓋run()方法。
  • 構建一個實現Runnable介面的類, 然後建立一個thread類物件並傳遞Runnable物件作為構造引數

在這個指南中,我們將使用第二種方法來製作一個簡單的程式,它能建立和執行10個執行緒。每一個執行緒能計算和輸出1-10以內的乘法表。

準備
指南中的例子是使用Eclipse IDE 來實現的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 開啟並建立一個新的java專案。

怎麼做呢

按照這些步驟來實現下面的例子:

1.     建立一個名為Calculator的類,這個類要實現Runnable介面。

public class Calculator implements Runnable {

2.   宣告一個名為number 的private int為屬性,然後實現建構函式並初始化其值。

private int number;
public Calculator(int number) {
    this.number=number;
}

3.   實現run()方法. 這方法是給我們建立的執行緒執行指令,所以這個方法將計算數字乘法表。

@Override
public void run() {
  for (int i=1; i<=10; i++){
   System.out.printf("%s: %d * %d = %d\n",Thread.currentThread().getName(),number,i,i*number);
}
}

4.   現在, 實現程式的Main類。建立一個名為 Main的類幷包含 main() 方法.

public class Main {
    public static void main(String[] args) {

5.   在 main() 方法內,建立一個迭代10次的for迴圈。在每次迴圈中,建立一個 Calculator 類的物件,  一個Thread類的物件, 然後傳遞 Calculator 物件作為thread類建構函式的引數,最後呼叫執行緒物件的start() 方法。

for (int i=1; i<=10; i++){
   Calculator calculator=new Calculator(i); Thread thread=new Thread(calculator);
   thread.start();
}

6.   執行程式並觀察不同的執行緒是如何並行工作的。

它是怎麼工作的

接下來是部分的程式輸出的裁圖。我們可以檢視全部建立的執行緒,並行地執行, 見下圖:
1-1

每個Java程式最少有一個執行執行緒。當你執行程式的時候, JVM執行負責呼叫main()方法的執行執行緒。

當呼叫Thread物件的start()方法時, 我們建立了另一個執行執行緒。在這些start()方法調出後,我們的程式就有了多個執行執行緒。

當全部的執行緒執行結束時(更具體點,所有非守護執行緒結束時),Java程式就結束了。如果初始執行緒(執行main()方法的主執行緒)執行結束,其他的執行緒還是會繼續執行直到執行完成。但是如果某個執行緒呼叫System.exit()指示終結程式,那麼全部的執行緒都會結束執行。

建立一個Thread類的物件不會建立新的執行執行緒。同樣,呼叫實現Runnable介面的 run()方法也不會建立一個新的執行執行緒。只有呼叫start()方法才能建立一個新的執行執行緒。

更多

在介紹這個指南時我們提到還有另一種方法可以建立新的執行執行緒。你可以實現一個類,這個類擴充套件Thread類並覆蓋它的run()方法。接著,你就可以從這個類建立一個物件並呼叫start()方法來建立一個新的執行執行緒。

參見

  • 第一章,執行緒管理:通過建立工廠建立執行緒