創建線程的一種方法是聲明實現 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();
/*
*重寫Runnable的run方法
*/
@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();
}
}
}