Java中線程的實現方式
1.實現Runnable接口
class MyThread implements Runnable{
private String name ; // 表示線程的名稱
public MyThread(String name){
this.name = name ; // 通過構造方法配置name屬性
}
public void run(){ // 覆寫run()方法,作爲線程 的操作主體
for(int i=0;i<10;i++){
System.out.println(name + "運行,i = " + i) ;
}
}
};
public class RunnableDemo01{
public static void main(String args[]){
MyThread mt1 = new MyThread("線程A ") ; // 實例化對象
MyThread mt2 = new MyThread("線程B ") ; // 實例化對象
Thread t1 = new Thread(mt1) ; // 實例化Thread類對象
Thread t2 = new Thread(mt2) ; // 實例化Thread類對象
t1.start() ; // 啓動多線程
t2.start() ; // 啓動多線程
}
};
2.繼承Thread類
class MyThread extends Thread{
private String name ; // 表示線程的名稱
public MyThread(String name){
this.name = name ; // 通過構造方法配置name屬性
}
public void run(){ // 覆寫run()方法,作爲線程 的操作主體
for(int i=0;i<10;i++){
System.out.println(name + "運行,i = " + i) ;
}
}
};
public class ThreadDemo01{
public static void main(String args[]){
MyThread mt1 = new MyThread("線程A ") ; // 實例化對象
MyThread mt2 = new MyThread("線程B ") ; // 實例化對象
mt1.start() ; // 啓動多線程
mt2.start() ; // 啓動多線程
}
};
線程的5種狀態
線程一般具有5種狀態,分別是創建、就緒、運行、阻塞、終止,各狀態說明如下:
-
創建狀態
在程序中用構造方法創建了一個線程對象後,新的線程對象便處於新建狀態,此時它已經有了相應的內存空間和其他資源,但還處於不可運行狀態。新建一個線程對象可採用Thread 類的構造方法來實現,例如 “Thread thread=new Thread()”。
-
就緒狀態
新建線程對象後,調用該線程的 start() 方法就可以啓動線程。當線程啓動時,線程進入就緒狀態。此時,線程將進入線程隊列排隊,等待 CPU 服務,這表明它已經具備了運行條件。
-
運行狀態
當就緒狀態被調用並獲得處理器資源時,線程就進入了運行狀態。此時,自動調用該線程對象的 run() 方法。run() 方法定義該線程的操作和功能。
-
阻塞狀態
一個正在執行的線程在某些特殊情況下,如被人爲掛起或需要執行耗時的輸入/輸出操作,會讓 CPU 暫時中止自己的執行,進入阻塞狀態。在可執行狀態下,如果調用sleep(),suspend(),wait() 等方法,線程都將進入阻塞狀態,發生阻塞時線程不能進入排隊隊列,只有當引起阻塞的原因被消除後,線程纔可以轉入就緒狀態。
-
死亡狀態
線程調用 stop() 方法時或 run() 方法執行結束後,即處於死亡狀態。處於死亡狀態的線程不具有繼續運行的能力。
線程同步
一個多線程程序如果通過Runnable實現,則類中的屬性會被多個線程共享,那麼多線程操作同一個資源時就可能出現資源同步問題。
解決方法:
1.同步代碼塊
synchronized(同步對象){
需要同步的代碼
}
2.同步方法
synchronized 方法返回值 方法名稱(參數列表){
}