Java中Thread和Runnable創建線程的方式對比
一、通過繼承Thread創建線程
通過繼承Thread類,創建一個線程,在主線程中,調用start,讓線程處於runnable狀態,讓系統去運行線程的方法。
public class MyThread extends Thread { @Override public void run() { System.out.println("執行線程"); } } public class ThreadTest { public static void main(String[] args) { Thread thread = new MyThread(); thread.start(); } }
二、實現Runnable創建檢查
通過實現runnable接口,創建一個線程,需要把runnable的實現類,作為Thread的構造方法的參數,運行這個線程。
public class MyThread implements Runnable { @Override public void run() { System.out.println("執行線程"); } } public class ThreadTest { public static void main(String[] args) { Runnable thread = new MyThread(); Thread thread1 = new Thread(thread); thread1.start(); } }
這裡要註意一些,runnable的實現類,是沒有start()方法的,隻有run()方法
如果運行這個run方法,依然能運行線程的方法,但是,這個方法並不是在新的線程中運行的,而是在主線程中運行的。
public class MyThread implements Runnable { @Override public void run() { System.out.println("此方法在:"+Thread.currentThread().getName()+"中運行"); } } public class ThreadTest { public static void main(String[] args) { Runnable run = new MyThread(); System.out.println("此方法在:"+Thread.currentThread().getName()+"中執行"); run.run(); // Thread thread1 = new Thread(run); // thread1.start(); } }
運行結果:
如果把註釋打開,run()註釋掉,結果如下:
三、比較兩種創建方式
3.1、多繼承
Java是不支持類的多繼承的,但是支持接口的多實現,所以Runnable在使用上更加靈活。
3.2、 數據共享
如果一個類繼承Thread,則不適合資源共享。但是如果實現瞭Runable接口的話,則很容易的實現資源共享。
如果線程中有一個成員變量,使用Runnable創建的線程,多個線程之間可以共同訪問這個變量,而Thread不可以。
為什麼呢?一個Thread創建的線程,每次都是new的一個新的線程對象,線程對象之間的成員變量不共享。而Runnale,可以作為Thread類的參數,可以多創建幾個Thread類,把Runnale作為參數,讓多個線程一起運行。
public class ThreadTest { public static void main(String[] args) { Runnable run = new MyThread(); Thread thread1 = new Thread(run); Thread thread2 = new Thread(run); Thread thread3 = new Thread(run); thread1.start(); thread2.start(); thread3.start(); } }
3.3、線程池
線程池隻能放入實現Runable或callable類線程,不能直接放入繼承Thread的類。
四、源碼分析
當我們進入Thread方法,可以看的Thread也實現瞭Runnable接口
使用Thread肯定也實現瞭他的run方法。
可以看出,在這個run方法中,如果target不為空,執行target的run方法,那target是什麼?
進入後,發現是runnable接口,那它是如何初始化的?突然想起,執行runnable的實現類時,都會把他通過構造函數傳遞,那來看看構造函數。
繼續往下,可以看出確實是在這裡初始化的。
所以,Runnbale接口的run方法,是通過Thread的成員變量去執行的。
到此這篇關於Java中Thread和Runnable創建線程的方式對比的文章就介紹到這瞭,更多相關Java中Thread和Runnable創建線程內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java中使用Thread類和Runnable接口實現多線程的區別
- 新手瞭解java 多線程基礎知識
- Java創建並運行線程的方法
- 詳解在Java中如何創建多線程程序
- Java多線程Thread類的使用及註意事項