如何實現多執行緒

流華追夢發表於2023-05-19

一. 執行緒的狀態

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. 執行緒池

 

相關文章