什麼是 Runnable
-
Runnable 介面是用來定義一個任務的介面,這個任務可以在執行緒中執行。通俗地說,它就像一個“待辦事項”,用來描述需要在一個單獨的執行緒中完成的工作。Runnable 介面非常簡單,只定義了一個方法:
run()
。當一個類實現了 Runnable 介面時,它需要提供這個方法的實現,裡面寫上你想要在新執行緒中執行的程式碼public interface Runnable { void run(); }
使用 Runnable 的場景
- 開發一個應用程式時,需要在後臺執行一些任務,比如處理檔案、下載資料或者執行耗時的計算。不希望這些任務阻塞主執行緒(特別是在圖形使用者介面應用中,阻塞主執行緒會導致介面卡頓)時。就可以使用 Runnable 來建立一個新的任務,並把它交給一個執行緒去處理
Runnable 介面的使用
-
實現 Runnable 介面:建立一個類來實現 Runnable 介面,並重寫
run()
方法。在這個方法裡,編寫想要執行的程式碼public class MyRunnable implements Runnable { @Override public void run() { // 這裡是你希望線上程中執行的程式碼 for (int i = 0; i < 5; i++) { System.out.println("Hello from a thread! " + i); try { Thread.sleep(1000); // 讓執行緒休眠1秒 } catch (InterruptedException e) { e.printStackTrace(); } } } }
-
建立執行緒並傳入 Runnable 例項:建立一個 Thread 物件,並傳入建立的 Runnable 例項。然後呼叫
start()
方法來啟動執行緒public class Main { public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); // 建立Runnable例項 Thread thread = new Thread(myRunnable); // 建立一個執行緒並傳入Runnable例項 thread.start(); // 啟動執行緒 // 主執行緒可以繼續做其他事情 for (int i = 0; i < 5; i++) { System.out.println("Hello from the main thread! " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
- 執行這個程式時,你會看到兩個“Hello”訊息交替輸出,一個來自主執行緒,一個來自新的執行緒
Runnable 和 Thread 的區別解析
-
Runnable 是一個介面:它只包含一個
run()
方法,用來定義需要在執行緒中執行的任務邏輯 -
Thread 是一個類:它本身是一個執行緒,它可以直接呼叫
start()
方法來啟動執行緒 -
關注點區別:Runnable 和 Thread 的設計體現了物件導向程式設計中的關注點分離原則。Runnable 關注的是“要做什麼事情”,而 Thread 關注的是“如何去做這件事情”
Runnable 介面的好處
-
靈活性:透過實現 Runnable 介面,一個類可以繼續繼承其他類,因為 Java 是單繼承的。但如果直接繼承 Thread 類,那麼這個類就不能繼承其他類了
-
任務與執行緒的分離:使用 Runnable 可以將任務的定義與執行分開,讓一個任務可以在多個執行緒中執行,或者在某些情況下可以複用
-
更好的物件導向設計:使用 Runnable 介面能更好地實現物件的解耦,讓任務的執行方式更加靈活和可控
總結
- Runnable 介面是實現多執行緒的一種簡單而靈活的方式。透過實現 Runnable 介面並將其傳遞給 Thread 物件,我們可以很容易地在程式中建立和管理多個執行緒,確保每個任務都能在後臺高效地執行而不阻塞主執行緒的執行