Java多線程 2 Runnable類

Java實現多線程更好的方法:實現Runnable接口並實現run()方法

package thread;

/*
 線程運行的五個狀態:創建,運行(有運行資格,正在運行),等待(無運行資格,無運行),就緒(有運行資格,無運行),消亡
 創建 --start()--> 就緒
 
 就緒 --獲得CPU--> 運行
 運行 --中斷--> 就緒
 
 運行 --sleep()--> 等待
 等待 --sleep時間到--> 就緒
 
 運行 --wait()--> 等待
 等待 --notify()--> 就緒
  
 運行 --退出--> 消亡 
 
需求:簡單的賣票程序。
多個窗口同時買票。


創建線程的第二種方式:實現Runable接口

步驟:
1,定義類實現Runnable接口
2,覆蓋Runnable接口中的run方法。將線程要運行的代碼存放在該run方法中。
3,通過Thread類建立線程對象。
4,將Runnable接口的子類對象作爲實際參數傳遞給Thread類的構造函數。
	爲什麼要將Runnable接口的子類對象傳遞給Thread的構造函數。
	因爲,自定義的run方法所屬的對象是Runnable接口的子類對象。
	所以要讓線程去指定指定對象的run方法。就必須明確該run方法所屬對象。
5,調用Thread類的start方法開啓線程,他會自動調用Runnable接口子類的run方法。


實現方式和繼承方式有什麼區別呢?

實現方式好處:避免了單繼承的侷限性。在定義線程時,建立使用實現Runnable方式。

兩種方式區別:
繼承Thread:線程代碼存放Thread子類run方法中。
實現Runnable,線程代碼存在接口的子類的run方法。

另:如果需要執行多線程的代碼段比較短小,可以在代碼中使用內部類或者匿名內部類,直接執行線程,會比較靈活多變
*/

public class Thread_2_RunnableDemo {
	public static void main(String[] args) 
	{

		Ticket t = new Ticket();

		Thread t1 = new Thread(t);//創建了一個線程;
		Thread t2 = new Thread(t);//創建了一個線程;
		Thread t3 = new Thread(t);//創建了一個線程;
		Thread t4 = new Thread(t);//創建了一個線程;
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}



//class Ticket extends Thread{
class Ticket implements Runnable{   	//建議使用實現Runnbale接口方式

	//private static int tick = 100;  	//用靜態確實可以解決賣太多票的問題,但是其生命週期太長
	private int tick = 100;
	
	public void run(){
		while(true){			
			if(tick>0){
				try {Thread.sleep(10);} catch (InterruptedException e) {}    //這裏可以導致同步異常
				
				System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
			}else{
				break;
			}
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章