【併發技術01】傳統執行緒技術中建立執行緒的兩種方式
傳統的執行緒技術中有兩種建立執行緒的方式:一是繼承
Thread
類,並重寫
run
()
方法;二是實現
Runnable
介面,覆蓋介面中的
run
()
方法,並把
Runnable
介面的實現扔給
Thread
。這兩種方式大部分人可能都知道,但是為什麼這樣玩就可以呢?下面我們來詳細分析一下這兩種方法的來龍去脈。
1. 揭秘Thread中run()
上面我們看到這兩種方式都跟
run
()
方法有關,所以我們來看一下
Thread
的原始碼中
run
()
方法到底都幹了什麼:
@Override public void run() { if (target != null) { target.run(); } }
我們可以看出,
run
()
方法中很簡單,只有一個
if
語句,如果 target 不為空就執行 target 的
run
()
方法,否則什麼也不幹,那麼這 target 到底是何方神聖呢?我們點選進去可以看到:
private Runnable target;
原來 target 就是 Runnable 介面,我們再點進 Runnable 看看:
@FunctionalInterface public interface Runnable { public abstract void run(); }
Runnable 中就一個方法,也是
run
()
方法!好了,現在再回到 Thread 類的
run
()
方法中,如果 target 不為空,即實現了 Runnable 介面,也即實現了 Runnable 中的
run
()
方法,那麼我們就使用該介面中的
run
()
方法;如果 target 為空,即沒有實現 Runnable 介面,那我們什麼也不做,即執行緒建立後立馬就消失了。
所以到這裡,大家就明白了為什麼建立執行緒有上面兩種方式了。第一種:你不是要先進行
if
判斷麼?我現在不判斷了,我把你的
if
幹掉,我在
run
()
方法中自己寫程式碼,想幹啥就幹啥,即重寫 Thread 中的
run
()
方法,;第二種:你不是要先進行
if
判斷麼?行,給你一個 Runnable 介面讓你判斷,但你還是得呼叫我 Runnable 中的
run
()
方法啊,那我重寫我 Runnable 中的
run
()
方法不就行了! 知道了來龍去脈後,下面就針對這兩種傳統的方式寫個例項。
2. 建立方式1:繼承 Thread 類
只要兩步即可建立並開啟一個執行緒:
-
繼承
Thread
類,並實現run ()
方法; -
呼叫
start ()
方法開啟執行緒。
由於只要實現一個
run
()
方法即可,所以我們可以使用 Java 中的匿名內部類來實現,如下:
public class TraditionalThread { public static void main(String[] args) { /********** 第一種方法:繼承Thread類,覆寫run()方法 **************/ Thread thread1 = new Thread(){ @Override public void run() { try { Thread.sleep(500);//讓執行緒休息500毫秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName());//列印出當前執行緒名 } }; thread1.start();//開啟執行緒 } }
3. 建立方式2:實現 Runnable 介面
只要兩步即可建立並開啟一個執行緒:
-
實現
Runnable
介面,並實現run ()
方法; -
呼叫
start ()
方法開啟執行緒。
由於只要實現一個
run
()
方法即可,所以我們也可以使用 Java 中的匿名內部類來實現,如下:
public class TraditionalThread { public static void main(String[] args) { /********** 第二種方法:實現Runnable介面,扔給Thread **************/ Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } }); thread2.start(); } }
4. 兩種方式同時使用
如果有個哥們比較給力,他兩種方式同時使用了,即:既實現了 Thread 類中的
run
()
方法,又給 Thread 扔了一個實現了
run
()
方法的 Runnable。如下所示:
public class TraditionalThread { public static void main(String[] args) { //這哥們的程式碼寫的比較給力 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Runnable:" + Thread.currentThread().getName()); } }){ @Override public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread:" + Thread.currentThread().getName()); } }.start(); } }
現在又會執行哪個呢?我們執行一下上面的程式就會發現,它會列印出 Thread 的資訊,所以執行的是 Thread 的
run
()
方法,知道結論了,但是為啥呢?
從物件導向的思想去考慮:上面一段程式碼其實是新 new 了一個物件(子物件)繼承了 Thread 物件(父物件),在子物件裡重寫了父類的
run
()
方法,父物件中扔了個 Runnable 進去,父物件中的
run
()
方法就是最初的帶有
if
判斷的
run
()
方法。
好了,現在執行
start
()
後,肯定先在子類中找
run
()
方法,找到了,父類的
run
()
方法自然就被幹掉了,所以會列印出 Thread:,如果我們現在假設子類中沒有重寫
run
()
方法,那麼必然要去父類找
run
()
方法,父類的
run
()
方法中就得判斷是否有 Runnable 傳進來,現在有一個,所以執行 Runnable 中的
run
()
方法,那麼就會列印 Runnable: 出來。
OK,傳統的建立執行緒的兩種方式就總結這麼多~
如果覺得對您有幫助,轉發給更多人吧~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558358/viewspace-2217369/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java併發基礎01:揭祕傳統執行緒技術中建立執行緒的兩種方式Java執行緒
- 【併發技術03】傳統執行緒互斥技術—synchronized執行緒synchronized
- 【併發技術02】傳統執行緒技術中的定時器技術執行緒定時器
- Java併發技術05:傳統執行緒同步通訊技術Java執行緒
- Java併發基礎02:傳統執行緒技術中的定時器技術Java執行緒定時器
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- 【併發技術04】執行緒技術之死鎖問題執行緒
- Java併發基礎03:傳統執行緒的互斥技術—synchronizedJava執行緒synchronized
- 多執行緒與併發-----Lock鎖技術執行緒
- Java併發(三)----建立執行緒的三種方式及檢視程式執行緒Java執行緒
- 多執行緒核心技術(1)-執行緒的基本方法執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- iOS 多執行緒的四種技術方案iOS執行緒
- 併發程式設計 建立執行緒的三種方式程式設計執行緒
- 建立執行緒的三種方式執行緒
- 執行緒建立的四種方式執行緒
- 保證執行緒安全的技術執行緒
- 執行緒池建立的幾種方式執行緒
- java核心技術筆記--執行緒Java筆記執行緒
- 執行緒池的五種狀態及建立執行緒池的幾種方式執行緒
- 多執行緒的建立 兩種方式以及使用建議執行緒
- 前端開發技術-剖析JavaScript單執行緒前端JavaScript執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- Java併發基礎04:執行緒技術之死鎖問題Java執行緒
- Java建立多執行緒的四種方式Java執行緒
- Java 中執行緒池的7種建立方式!Java執行緒
- java的執行緒、建立執行緒的 3 種方式、靜態代理模式、Lambda表示式簡化執行緒Java執行緒模式
- jdk建立執行緒的方式JDK執行緒
- 在netty3.x中存在兩種執行緒:boss執行緒和worker執行緒。Netty執行緒
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 建立執行緒的4種方法 and 執行緒的生命週期執行緒
- 一執行緒序員忙著學習技術,二執行緒序員忙著技術變現,你呢?執行緒
- 多執行緒併發篇——如何停止執行緒執行緒
- python基礎執行緒-管理併發執行緒Python執行緒
- 前端開發技術-剖析JavaScript單執行緒 原創前端JavaScript執行緒
- 執行緒池建立方式執行緒