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;
}
}
}
}