1. 程式人生 > >Java例項 定義任務的一個發射小程式 實現Runnable介面並編寫run()方法

Java例項 定義任務的一個發射小程式 實現Runnable介面並編寫run()方法


舉例:

class LiftOff implements Runnable {
protected int countDown = 10;  //預設值
private static int taskCount = 0 ;
private final int id = taskCount++;

public LiftOff(int countDown) {
this.countDown = countDown;
}


public LiftOff() {
// TODO Auto-generated constructor stub
}


public String status() {
return "#" + id + "(" + (countDown >0 ? countDown : "Liftoff!") + ") ";
}



@Override
public void run() {
// TODO Auto-generated method stub
do {
System.out.println(status());
Thread.yield();
} while (countDown-- >0) ;
}


}


public class Test05 {
public static void main(String[] args) {
LiftOff launch = new LiftOff();
launch.run();
}


}

執行結果:

#0(10) 
#0(9) 
#0(8) 
#0(7) 
#0(6) 
#0(5) 
#0(4) 
#0(3) 
#0(2) 
#0(1) 
#0(Liftoff!) 

拓展:Thread類

public class Thread implements Runnable {}

改進:


class LiftOff implements Runnable {
protected int countDown = 10;  //預設值
private static int taskCount = 0 ;
private final int id = taskCount++;

public LiftOff(int countDown) {
this.countDown = countDown;
}


public LiftOff() {
// TODO Auto-generated constructor stub
}


public String status() {
return "#" + id + "(" + (countDown >0 ? countDown : "發射!") + ") ";
}



@Override
public void run() {
// TODO Auto-generated method stub
do {
try {
Thread.sleep(1000); 

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(status());
Thread.yield();
} while (countDown-- >0) ;
}


}


public class Test05 {
public static void main(String[] args) {
Thread t = new Thread(new LiftOff());
t.start();

System.out.println("倒計時十秒,等待發射!");

}

}

演示多個火箭發射:

class LiftOff implements Runnable {
protected int countDown = 10;  //預設值
private static int taskCount = 0 ;
private final int id = taskCount++;

public LiftOff(int countDown) {
this.countDown = countDown;
}


public LiftOff() {
// TODO Auto-generated constructor stub
}


public String status() {
return "#" + id + "(" + (countDown >0 ? countDown : "發射!") + ") ";
}



@Override
public void run() {
// TODO Auto-generated method stub
do {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(status());
Thread.yield();
} while (countDown-- >0) ;
}


}


public class Test05 {
public static void main(String[] args) {
//Thread t = new Thread(new LiftOff());
//t.start();
//System.out.println("倒計時十秒,火箭1等待發射!");
//
//Thread t2 = new Thread(new LiftOff());
//t2.start();
//System.out.println("倒計時十秒,火箭2等待發射!");
//
//Thread t3 = new Thread(new LiftOff());
//t3.start();
//System.out.println("倒計時十秒,火箭3等待發射!");
for (int i = 1; i < 5; i++) {
new Thread(new LiftOff()).start();
System.out.println("倒計時十秒,火箭"+i+"等待發射!");
}


}


}

執行結果:

倒計時十秒,火箭1等待發射!
倒計時十秒,火箭2等待發射!
倒計時十秒,火箭3等待發射!
倒計時十秒,火箭4等待發射!
#1(10) 
#0(10) 
#3(10) 
#2(10) 
#1(9) 
#0(9) 
#3(9) 
#2(9) 
#1(8) 
#0(8) 
#3(8) 
#2(8) 
#1(7) 
#0(7) 
#2(7) 
#3(7) 
#0(6) 
#1(6) 
#2(6) 
#3(6) 
#0(5) 
#1(5) 
#3(5) 
#2(5) 
#1(4) 
#0(4) 
#3(4) 
#2(4) 
#1(3) 
#0(3) 
#2(3) 
#3(3) 
#1(2) 
#2(2) 
#3(2) 
#0(2) 
#2(1) 
#1(1) 
#3(1) 
#0(1) 
#3(發射!) 
#2(發射!) 
#1(發射!) 
#0(發射!) 

知識說明:

(1)sleep()方法和wait()方法的區別

對於sleep()方法,我們首先要知道該方法是屬於Thread類中的。而wait()方法,則是屬於Object類中的。

sleep()方法導致了程式暫停執行指定的時間,讓出cpu該其他執行緒,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復執行狀態。

在呼叫sleep()方法的過程中,執行緒不會釋放物件鎖。

而當呼叫wait()方法的時候,執行緒會放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件呼叫notify()方法後本執行緒才進入物件鎖定池準備

(2) 認識Thread的 start() 和 run()

1.start():
     使該執行緒開始執行;Java 虛擬機器呼叫該執行緒的 run 方法。
     結果是兩個執行緒併發地執行;當前執行緒(從呼叫返回給 start 方法)和另一個執行緒(執行其 run 方法)。
     多次啟動一個執行緒是非法的。特別是當執行緒已經結束執行後,不能再重新啟動。
     用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫Thread類的 start()方法來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法,這裡方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容,Run方法執行結束,此執行緒隨即終止。


2.run():
     如果該執行緒是使用獨立的 Runnable 執行物件構造的,則呼叫該 Runnable 物件的 run 方法;否則,該方法不執行任何操作並返回。
    Thread 的子類應該重寫該方法。

     run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。

3。總結:
     呼叫start方法方可啟動執行緒,而run方法只是thread的一個普通方法呼叫,還是在主執行緒裡執行。