一. 執行緒的狀態
1).新建狀態(New)
2).就緒狀態(Runnable):
當呼叫執行緒物件的start()方法(t.start();),執行緒即進入就緒狀態。處於就緒狀態的執行緒,只是說明此執行緒已經做好了準備,隨時等待CPU排程執行,並不是說執行了t.start()此執行緒立即就會執行;
3).執行狀態(Running)
4).阻塞狀態(Blocked)
阻塞狀態又可以分為三種:
a.等待阻塞: 執行狀態中的執行緒執行wait()方法,使本執行緒進入到等待阻塞狀態;
b.同步阻塞: 執行緒在獲取synchronized同步鎖失敗(因為鎖被其它執行緒所佔用),它會進入同步阻塞狀態;
c.其他阻塞: 透過呼叫執行緒的sleep()或join()或發出了I/O請求時,執行緒會進入到阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。
5).死亡狀態(Dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。
二. 實現多執行緒的4種方式
1. 實現Thread類
1 public class TestThread extends Thread { 2 @Override 3 public void run() { 4 System.out.println("當前執行緒名" + "->" + Thread.currentThread().getName()); 5 } 6 } 7 8 public static void main(String[] args) { 9 TestThread testThread = new TestThread(); 10 testThread.start(); 11 }
2. 實現Runnable介面
1 public class TestRunnable implements Runnable { 2 @Override 3 public void run() { 4 System.out.println("當前執行緒名" + "->" + Thread.currentThread().getName()); 5 } 6 } 7 8 public static void main(String[] args) { 9 TestRunnable testRunnable = new TestRunnable(); 10 Thread thread = new Thread(testRunnable); 11 testThread.start(); 12 }
3. 實現Callable介面,例項化FutureTask類
1 public class TestCallable implements Callable<Object> { 2 @Override 3 public Object call() throws Exception { 4 System.out.println("當前執行緒名" + "->" + Thread.currentThread().getName()); 5 return null; 6 } 7 } 8 9 public static void main(String[] args) { 10 TestCallable testCallable = new TestCallable(); 11 FutureTask futureTask = new FutureTask(testCallable); 12 new Thread(futureTask).start(); 13 }
FutureTask 實現了介面 RunnableFuture,RunnableFuture繼承了Runnable介面,所以這種實現等同於方式2實現Runnable介面。
4. 執行緒池