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