您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)傳統(tǒng)的線程技術(shù)中創(chuàng)建線程的方式有哪些的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
傳統(tǒng)的線程技術(shù)中有兩種創(chuàng)建線程的方式:一是繼承 Thread
類(lèi),并重寫(xiě) run()
方法;二是實(shí)現(xiàn) Runnable
接口,覆蓋接口中的 run()
方法,并把 Runnable
接口的實(shí)現(xiàn)扔給 Thread
。這兩種方式大部分人可能都知道,但是為什么這樣玩就可以呢?下面我們來(lái)詳細(xì)分析一下這兩種方法的來(lái)龍去脈。
上面我們看到這兩種方式都跟 run()
方法有關(guān),所以我們來(lái)看一下 Thread
的源碼中 run()
方法到底都干了什么:
@Override public void run() { if (target != null) { target.run(); } }
我們可以看出, run()
方法中很簡(jiǎn)單,只有一個(gè) if
語(yǔ)句,如果 target 不為空就執(zhí)行 target 的 run()
方法,否則什么也不干,那么這 target 到底是何方神圣呢?我們點(diǎn)擊進(jìn)去可以看到:
private Runnable target;
原來(lái) target 就是 Runnable 接口,我們?cè)冱c(diǎn)進(jìn) Runnable 看看:
@FunctionalInterface public interface Runnable { public abstract void run(); }
Runnable 中就一個(gè)方法,也是 run()
方法!好了,現(xiàn)在再回到 Thread 類(lèi)的 run()
方法中,如果 target 不為空,即實(shí)現(xiàn)了 Runnable 接口,也即實(shí)現(xiàn)了 Runnable 中的 run()
方法,那么我們就使用該接口中的 run()
方法;如果 target 為空,即沒(méi)有實(shí)現(xiàn) Runnable 接口,那我們什么也不做,即線程創(chuàng)建后立馬就消失了。
所以到這里,大家就明白了為什么創(chuàng)建線程有上面兩種方式了。第一種:你不是要先進(jìn)行 if
判斷么?我現(xiàn)在不判斷了,我把你的 if
干掉,我在 run()
方法中自己寫(xiě)代碼,想干啥就干啥,即重寫(xiě) Thread 中的 run()
方法,;第二種:你不是要先進(jìn)行 if
判斷么?行,給你一個(gè) Runnable 接口讓你判斷,但你還是得調(diào)用我 Runnable 中的 run()
方法啊,那我重寫(xiě)我 Runnable 中的 run()
方法不就行了! 知道了來(lái)龍去脈后,下面就針對(duì)這兩種傳統(tǒng)的方式寫(xiě)個(gè)實(shí)例。
只要兩步即可創(chuàng)建并開(kāi)啟一個(gè)線程:
繼承 Thread
類(lèi),并實(shí)現(xiàn) run()
方法;
調(diào)用 start()
方法開(kāi)啟線程。
由于只要實(shí)現(xiàn)一個(gè) run()
方法即可,所以我們可以使用 Java 中的匿名內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),如下:
public class TraditionalThread { public static void main(String[] args) { /********** 第一種方法:繼承Thread類(lèi),覆寫(xiě)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());//打印出當(dāng)前線程名 } }; thread1.start();//開(kāi)啟線程 } }
只要兩步即可創(chuàng)建并開(kāi)啟一個(gè)線程:
實(shí)現(xiàn) Runnable
接口,并實(shí)現(xiàn) run()
方法;
調(diào)用 start()
方法開(kāi)啟線程。
由于只要實(shí)現(xiàn)一個(gè) run()
方法即可,所以我們也可以使用 Java 中的匿名內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),如下:
public class TraditionalThread { public static void main(String[] args) { /********** 第二種方法:實(shí)現(xiàn)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(); } }
如果有個(gè)哥們比較給力,他兩種方式同時(shí)使用了,即:既實(shí)現(xiàn)了 Thread 類(lèi)中的 run()
方法,又給 Thread 扔了一個(gè)實(shí)現(xiàn)了 run()
方法的 Runnable。如下所示:
public class TraditionalThread { public static void main(String[] args) { //這哥們的代碼寫(xiě)的比較給力 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(); } }
現(xiàn)在又會(huì)執(zhí)行哪個(gè)呢?我們運(yùn)行一下上面的程序就會(huì)發(fā)現(xiàn),它會(huì)打印出 Thread 的信息,所以運(yùn)行的是 Thread 的 run()
方法,知道結(jié)論了,但是為啥呢?
從面向?qū)ο蟮乃枷肴タ紤]:上面一段代碼其實(shí)是新 new 了一個(gè)對(duì)象(子對(duì)象)繼承了 Thread 對(duì)象(父對(duì)象),在子對(duì)象里重寫(xiě)了父類(lèi)的 run()
方法,父對(duì)象中扔了個(gè) Runnable 進(jìn)去,父對(duì)象中的 run()
方法就是最初的帶有 if
判斷的 run()
方法。
好了,現(xiàn)在執(zhí)行 start()
后,肯定先在子類(lèi)中找 run()
方法,找到了,父類(lèi)的 run()
方法自然就被干掉了,所以會(huì)打印出 Thread:,如果我們現(xiàn)在假設(shè)子類(lèi)中沒(méi)有重寫(xiě) run()
方法,那么必然要去父類(lèi)找 run()
方法,父類(lèi)的 run()
方法中就得判斷是否有 Runnable 傳進(jìn)來(lái),現(xiàn)在有一個(gè),所以執(zhí)行 Runnable 中的 run()
方法,那么就會(huì)打印 Runnable: 出來(lái)。
感謝各位的閱讀!關(guān)于“傳統(tǒng)的線程技術(shù)中創(chuàng)建線程的方式有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。