java多執行緒程式設計--模擬龜兔賽跑過程
阿新 • • 發佈:2018-12-10
剛開始學多執行緒程式設計,課上也沒認真聽,課下去網上找了PPT,又認真的學了一遍。
問題:
- 編寫龜兔賽跑多執行緒程式,設賽跑長度為100米,每跑完10米輸出一次結果。
- 採用實現Runnable介面的方法編寫龜兔賽跑多執行緒程式,功能與1完全一樣。
- 改進1的龜兔賽跑程式,通過改變優先順序,並減掉休眠時間,使得烏龜以迅雷不及掩耳的速度跑完100米。
- 編寫兔子休眠後被烏龜中斷(吵醒)的多執行緒程式。
問題①
Animal 類:
public class Animal extends Thread{ public Animal(String name){ super(name); } public void run(){ for(int i=0;i<=100;i+=10){ if(this.getName().equals("烏龜")) System.out.println("烏龜跑了 "+ i + " 米"); else System.out.println("兔子跑了 "+ i + " 米"); } try{ Thread.sleep((long)(Math.random()*1000)); } catch(InterruptedException e){ e.printStackTrace(); } } }
測試類:
public class Quetion1 {
public static void main(String[] args) {
Animal rabbit = new Animal("兔子");
Animal tortoise = new Animal("烏龜");
rabbit.start();
tortoise.start();
}
}
問題②
Animal 類:
public class Animal implements Runnable{ private String name; public Animal(String name){ this.name=name; } public String getName(){ return this.name; } public void run(){ for(int i=0;i<=100;i+=10){ if(this.getName().equals("烏龜")) System.out.println("烏龜跑了 "+ i + " 米"); else System.out.println("兔子跑了 "+ i + " 米"); } try{ Thread.sleep((long)(Math.random()*1000)); } catch(InterruptedException e){ e.printStackTrace(); } } }
測試類:
public class Quetion2 {
public static void main(String[] args) {
Animal rabbit = new Animal("兔子");
Animal tortoise = new Animal("烏龜");
Thread t1 = new Thread(rabbit);
Thread t2 = new Thread(tortoise);
t1.start();
t2.start();
}
}
問題③
Animal 類:
public class Animal extends Thread{ public Animal(String name) { super(name); } public void run() { for(int i=0;i<=100;i+=10) { if(this.getName().equals("烏龜")) System.out.println("烏龜跑了 " + i + "米"); else System.out.println("兔子跑了 " + i + "米"); } } }
測試類:
public class Question3 {
public static void main(String[] args) {
Animal rabbit = new Animal("兔子");
Animal tortoise = new Animal("烏龜");
rabbit.setPriority(1);
tortoise.setPriority(10);
rabbit.start();
tortoise.start();
}
}
問題④
Animal 類:
public class Animal implements Runnable{
Thread rabbit,tortoise;
public Animal() {
rabbit = new Thread(this,"兔子");
tortoise = new Thread(this,"烏龜");
}
public void run() {
if(Thread.currentThread() == tortoise) {
System.out.println("此時兔子在休眠,被烏龜吵醒。烏龜說:該你去跑步了!");
rabbit.interrupt();
System.out.println("烏龜繼續跑步...");
}
else {
try{
System.out.println("兔子正在休眠...烏龜正在跑步");
rabbit.sleep(1000*60);
}
catch(InterruptedException e) {
System.out.println("兔子被叫醒");
System.out.println("兔子開始跑步");
}
}
}
}
測試類:
public class Question4 {
public static void main(String[] args) {
Animal animal = new Animal();
System.out.println("開始狀態:");
System.out.println("兔子的執行緒狀態: " + animal.rabbit.getState());
System.out.println("烏龜的執行緒狀態: " + animal.tortoise.getState());
System.out.println("比賽開始:");
animal.rabbit.start();
animal.tortoise.start();
System.out.println("兔子的執行緒狀態: " + animal.rabbit.getState());
System.out.println("烏龜的執行緒狀態: " + animal.tortoise.getState());
System.out.println("當前活動匯流排程數: " + Thread.activeCount());
/*這裡輸出匯流排程數位3,因為除了烏龜和兔子還有一個主執行緒*/
}
}