Java中的Runnable和Thread是多線程編程中非常常用的兩個概念。雖然它們都可以用來實現線程,但是它們之間卻有一些重要的區別。
Runnable是一個接口,只包含了一個run()方法。需要用Thread類的構造函數來創建一個線程對象,并將Runnable對象作為參數傳遞給Thread的構造函數。
public class MyRunnable implements Runnable { public void run() { // 代碼塊 } } public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread t = new Thread(myRunnable); t.start(); }
Thread是一個類,也可以用來創建線程對象。Thread類實現了Runnable接口,所以當使用Thread類創建線程時,可以通過重寫run()方法來實現線程的執行邏輯。
public class MyThread extends Thread { public void run() { // 代碼塊 } } public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); }
從以上代碼可以看出,使用Runnable與使用Thread創建線程的代碼結構不同。由于Java不支持多重繼承,如果已經繼承了某個類,那么只能通過實現Runnable接口來創建線程。
在大部分情況下,使用Runnable會比使用Thread更加靈活。因為當一個類已經繼承了其他類時,實現Runnable接口還可以讓該類繼續拓展擴展其他的接口。
此外,當需要實現線程池或者實現比較復雜的自定義線程邏輯時,使用Runnable也是更好的選擇。