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的一個普通方法呼叫,還是在主執行緒裡執行。