溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

傳統(tǒng)的線程技術(shù)中創(chuàng)建線程的方式有哪些

發(fā)布時(shí)間:2021-11-30 17:57:47 來(lái)源:億速云 閱讀:171 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(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)龍去脈。

1. 揭秘Thread中run()

上面我們看到這兩種方式都跟 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í)例。

2. 創(chuàng)建方式1:繼承 Thread 類(lèi)

只要兩步即可創(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)啟線程
    }
}

3. 創(chuàng)建方式2:實(shí)現(xiàn) Runnable 接口

只要兩步即可創(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();
    }
}

4. 兩種方式同時(shí)使用

如果有個(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ò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI