創建線程方式之實現Runnable接口1

         創建線程的一種方法是聲明實現 Runnable 接口的類。該類然後實現 run 方法。然後創建Runnable的子類對象,傳入到某個線程的構造方法中,開啓線程。爲何要實現Runnable接口,Runable是啥玩意呢?在API內搜索。查看Runnable接口說明文檔:Runnable接口用來指定每個線程要執行的任務。包含了一個 run 的無參數抽象方法,需要由接口實現類重寫該方法。

Runnable是在java.lang包下的接口,已知的實現類中主要是Thread類.

       其中接口的主要方法是void run(),即在實現接口Runnabled 的對象創建一個線程時候,啓動該線程時,在獨立執行的線程中直接調用對象的run方法.

Thread類的構造方法

Thread(Runnabletarget)

       分配新的Thread對象,以便將target作爲運行對象.

      Thread(Runnabletarget,String name)

       分配新的Thread對象,以便將target作爲運作對象,將指定的name作爲其名稱.

創建線程的步驟。

1、定義類實現Runnable接口。

2、覆蓋接口中的run方法。。

3、創建Thread類的對象

4、將Runnable接口的子類對象作爲參數傳遞給Thread類的構造函數。

5、調用Thread類的start方法開啓線程。

代碼演示:

public class Demo {

      publicstatic void main(String[] args) {

           //創建線程執行目標類對象

           Runnablerunn = new MyRunnable();

           //將Runnable接口的子類對象作爲參數傳遞給Thread類的構造函數

           Threadthread = new Thread(runn);

           Threadthread2 = new Thread(runn);

           //開啓線程

           thread.start();

           thread2.start();

           for(int i = 0; i < 10; i++) {

                 System.out.println("main線程:正在執行!"+i);

           }

      }

}

自定義線程執行任務類

public class MyRunnable implementsRunnable{

      //定義線程要執行的run方法邏輯

      @Override

      publicvoid run() {        

           for(int i = 0; i < 10; i++) {

                 System.out.println("該線程:正在執行!"+i);

           }

      }

}

 

         那麼Runnable 是如何實現了線程的功能的呢?爲什麼需要定一個類去實現Runnable接口呢?繼承Thread類和實現Runnable接口有啥區別呢?

實現Runnable接口,避免了繼承Thread類的單繼承侷限性。覆蓋Runnable接口中的run方法,將線程任務代碼定義到run方法中。創建Thread類的對象,只有創建Thread類的對象纔可以創建線程。線程任務已被封裝到Runnable接口的run方法中,而這個run方法所屬於Runnable接口的子類對象,所以將這個子類對象作爲參數傳遞給Thread的構造函數,這樣,線程對象創建時就可以明確要運行的線程的任務。

最後簡單講解一下實現Runnable的好處.

       實現Runnable接口避免了單繼承的侷限性,所以較爲常用。實現Runnable接口的方式,更加的符合面向對象,線程分爲兩部分,一部分線程對象,一部分線程任務。

繼承Thread類,線程對象和線程任務耦合在一起。一旦創建Thread類的子類對象,既是線程對象,有又有線程任務。

實現runnable接口,將線程任務單獨分離出來封裝成對象,類型就是Runnable接口類型。Runnable接口對線程對象和線程任務進行解耦。

編寫線程同步模擬應用程序:

      1. 大氣環境數據爲:溫度,溼度,風速;

      2. 一個大氣環境傳感器測量環境數據需要5秒時間;

      3. 一個計算機讀取傳感器獲得數據需要0.01秒時間;

      4. 模擬100個計算機讀取大氣環境傳感器獲取的隨機溫度,溼度,風速; 

操作步驟答案

/*

 * 1.定義一個傳感器類,實現Runnable接口

 */

publicclassSensor implements Runnable {

    Objectobj = newObject();

    /*

     *重寫Runnablerun方法

     */

    @Override

    publicvoidrun() {     

       synchronized(obj) {

       //子線程睡眠5秒鐘,模擬傳感器獲得溫度,溼度,風速需要的5秒鐘時間

           try{

              Thread.sleep(5000);

           }catch (InterruptedException e){

              e.printStackTrace();

           }         

       //使用Random模擬得到隨機的溫度,溼度和風速

           Randomr = newRandom();

       //溫度

           inttemperature= r.nextInt(50)+1;

       // 溼度

           inthumidity= r.nextInt(100)+1;

       // 風速

           intwindScale= r.nextInt(40)+1;

       //子線程睡眠0.01,模擬計算機讀取傳感器的數據需要的0.01秒時間

           try{

              Thread.sleep(10);

           } catch(InterruptedException e) {

              e.printStackTrace();

           }

       //打印溫度,溼度和風速, 模擬計算機讀取傳感器的數據

 

/*

 * 2.定義傳感器的測試類

 */

publicclassSensorDemo {

 

    publicstaticvoidmain(String[] args) {

       //main方法中創建傳感器類的對象

       Sensors = newSensor();

       //main方法中創建100個子線程對象,並把傳感器對象傳遞給構造方法,模擬100個計算機

       for(intx=1;x<=100;x++){

           Threadt = newThread(s);

       //開啓子線程,開啓讀取傳感器的獲取的大氣環境數據

           t.start();

       }

    }

}

發佈了56 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章