1. 程式人生 > >12章多執行緒應用案例

12章多執行緒應用案例

龜兔賽跑: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();
     
    }
}

執行結果: