Java中使用Thread類和Runnable接口實現多線程的區別
使用Thread類和Runnable接口實現多線程的區別
先看兩種實現方式的步驟:
public class ThreadDemo{ public static void main(String[] args) { for (int i = 0; i < 5; i++) { //創建並啟動由繼承Thread類創建的線程 new Thread(new MyThread(),"Thread"+i).start(); //創建並啟動由實現Runnable接口創建的線程 new Thread(new Runner(),"Thread"+i).start(); } } } //繼承Thread類 class MyThread extends Thread{ //重寫run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"由繼承Thread創建"); } } //實現Runnable接口 class Runner implements Runnable{ //實現run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"有實現Runnable接口創建"); } }
從上面代碼可以看出,當使用Runnable接口創建多線程時,需要將實現類作為參數出入到Thread實例對象中,通過調用Thread對象的start方法進行啟動。我們來看一下Thread的源碼
//Thread類繼承瞭Runnable類 public class Thread implements Runnable {} //Thread的構造函數調用瞭init方法 public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } //init調用瞭靜態方法init private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null, true); } //再看靜態方法init private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, boolean inheritThreadLocals) { ... //私有Runnable實例 this.target = target; ... } //再看一下Runnable方法 @Override public void run() { if (target != null) { target.run(); } }
從以上追蹤源碼過程可以看出,Thread類實現瞭 Runnable 接口,而繼承Thread類重寫 run 方法本質就是實現Runnable接口的 run 方法。
通過以上分析,總結使用 Thread 類和 Runnable 接口的區別:
- 使用繼承 Thread 類實現多線程相比於 Runnable 更加簡單,使用 Runnable 接口需要使用 Thread進行再次封裝。
- 由於 Java 中不支持多繼承,一個類繼承瞭 Thread 類後無法再繼承其他類,因此使用 Runnable 接口實現多線程有更好的靈活性。
除瞭以上兩種多線程實現方式,還可以使用 Callable 接口實現,我寫瞭一篇關於 Callable 和 Runnable 接口實現多線程對比的總結:
使用Runnable和Callable接口實現多線程的區別
到此這篇關於使用Thread類和Runnable接口實現多線程的區別的文章就介紹到這瞭,更多相關Thread類和Runnable接口實現多線程內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java線程的三種創建方式
- Java中Thread和Runnable創建線程的方式對比
- 如何在Java中創建線程通信的四種方式你知道嗎
- Java使用Runnable和Callable實現多線程的區別詳解
- 多線程Thread,Runnable,Callable實現方式