12章多執行緒應用案例
阿新 • • 發佈:2018-12-16
龜兔賽跑:20米 //只要為了看到效果,所有距離縮短了
要求:
1.兔子每秒0.5米的速度,每跑2米休息10秒,
2.烏龜每秒跑0.1米,不休息
3.其中一個跑到終點後另一個不跑了!
程式設計思路:
1.建立一個Animal動物類,繼承Thread,編寫一個running抽象方法,重寫run方法,把running方法在run方法裡面呼叫。
2.建立Rabbit兔子類和Tortoise烏龜類,繼承動物類
3.兩個子類重寫running方法
(一)建立Animal類
package nine; public abstract class Animal extends Thread{ public double length=20;//比賽的長度 public abstract void runing();//抽象方法需要子類實現 //在父類重寫run方法,在子類只要重寫running方法就可以了 @Override public void run() { super.run(); while (length>0) { runing(); } } //在需要回調資料的地方(兩個子類需要),宣告一個介面 public static interface Calltoback{ public void win(); } //2.建立介面物件 public Calltoback calltoback; }
(二)建立Rabbit類、Tortoise類
package nine; public class Rabbit extends Animal{ public Rabbit() { setName("兔子");// Thread的方法,給執行緒賦值名字 } // 重寫running方法,編寫兔子的奔跑操作 @Override public void runing() { // 跑的距離 double dis = 1.0; length -= dis;//跑完後距離減少 if (length <= 0) { length = 0; System.out.println("兔子獲得了勝利"); //給回撥物件賦值,讓烏龜不要再跑了 if (calltoback != null) { calltoback.win(); } } System.out.println("兔子跑了" + dis + "米,距離終點還有" + (int)length + "米"); if (length % 2 == 0) {// 兩米休息一次 try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package nine; public class Tortoise extends Animal{ public Tortoise() { setName("烏龜");// Thread的方法,給執行緒賦值名字 } // 重寫running方法,編寫烏龜的奔跑操作 public void runing() { // 跑的距離 double dis = 0.5; length -= dis; if (length <= 0) { length = 0; System.out.println("烏龜獲得了勝利"); // 讓兔子不要在跑了 if (calltoback != null) { calltoback.win(); } } System.out.println("烏龜跑了" + dis + "米,距離終點還有" + (int) length + "米"); try { sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }
(三)建立一個讓動物執行緒停止的類,這裡要實現回撥介面
package nine;
import nine.Animal.Calltoback;
public class LetOneStop implements Calltoback{
// 動物物件
Animal an;
// 獲取動物物件,可以傳入兔子或烏龜的例項
public LetOneStop(Animal an) {
this.an = an;
}
//讓動物的執行緒停止
@SuppressWarnings("deprecation")
@Override
public void win() {
// 執行緒停止
an.stop();
}
}
(五)建立一個主方法呼叫類
package nine;
public class MainClass {
public static void main(String[] args) {
// TODO 自動生成的方法存根
//例項化烏龜和兔子
Tortoise tortoise = new Tortoise();
Rabbit rabbit = new Rabbit();
//回撥方法的使用,誰先呼叫calltoback方法,另一個就不跑了
LetOneStop letOneStop1 = new LetOneStop(tortoise);
rabbit.calltoback = letOneStop1;//讓兔子的回撥方法裡面存在烏龜物件的值,可以把烏龜stop
LetOneStop letOneStop2 = new LetOneStop(rabbit);
tortoise.calltoback = letOneStop2;//讓烏龜的回撥方法裡面存在兔子物件的值,可以把兔子stop
//開始跑
tortoise.start();
rabbit.start();
}
}
執行結果: