1. 程式人生 > >java多執行緒程式設計--模擬龜兔賽跑過程

java多執行緒程式設計--模擬龜兔賽跑過程

剛開始學多執行緒程式設計,課上也沒認真聽,課下去網上找了PPT,又認真的學了一遍。

問題:

  1. 編寫龜兔賽跑多執行緒程式,設賽跑長度為100米,每跑完10米輸出一次結果。
  2. 採用實現Runnable介面的方法編寫龜兔賽跑多執行緒程式,功能與1完全一樣。
  3. 改進1的龜兔賽跑程式,通過改變優先順序,並減掉休眠時間,使得烏龜以迅雷不及掩耳的速度跑完100米。
  4. 編寫兔子休眠後被烏龜中斷(吵醒)的多執行緒程式。

問題①

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,因為除了烏龜和兔子還有一個主執行緒*/
	}

}