阿里后端Java面試題:?jiǎn)?dòng)線程是start()還是run()?為什么?

面試官:請(qǐng)問(wèn)啟動(dòng)線程是start()還是run()方法,能談?wù)剢幔?/p>

我們提供的服務(wù)有:網(wǎng)站制作、成都做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、秦淮ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的秦淮網(wǎng)站制作公司

應(yīng)聘者:start()方法

當(dāng)用start()開(kāi)始一個(gè)線程后,線程就進(jìn)入就緒狀態(tài),使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。但是這并不意味著線程就會(huì)立即運(yùn)行。只有當(dāng)cpu分配時(shí)間片時(shí),這個(gè)線程獲得時(shí)間片時(shí),才開(kāi)始執(zhí)行run()方法。start()是方法,它調(diào)用run()方法.而run()方法是你必須重寫(xiě)的. run()方法中包含的是線程的主體(真正的邏輯)。

繼承Thread類的啟動(dòng)方式

public class ThreadTest {
    public static void main(String[] args) {
        MyThread t =new MyThread();
        t.start();
    }
}
class MyThread extends Thread{
    @Override
         public void run() {
        System.out.println("Hello World!");
    }
}

實(shí)現(xiàn)Runnable接口的啟動(dòng)方式

public class ThreadTest {
    public static void main(String[] args) {
        Thread t =new Thread(new MyRunnable());
        t.start();
    }
}
class MyRunnable implements Runnable{
    @Override
         public void run() {
        System.out.println("Hello World!");
    }
}

實(shí)際上這兩種啟動(dòng)線程的方式原理是一樣的。首先都是調(diào)用本地方法啟動(dòng)一個(gè)線程,其次是在這個(gè)線程里執(zhí)行目標(biāo)對(duì)象的run()方法。那么這個(gè)目標(biāo)對(duì)象是什么呢?為了弄明白這個(gè)問(wèn)題,我們來(lái)看看Thread類的run()方法的實(shí)現(xiàn):

public void run() {
    if (target != null) {
        target.run();
    }
}

當(dāng)我們采用實(shí)現(xiàn)Runnable接口的方式來(lái)實(shí)現(xiàn)線程的情況下,在調(diào)用new Thread(Runnable target)構(gòu)造器時(shí),將實(shí)現(xiàn)Runnable接口的類的實(shí)例設(shè)置成了線程要執(zhí)行的主體所屬的目標(biāo)對(duì)象target,當(dāng)線程啟動(dòng)時(shí),這個(gè)實(shí)例的 run()方法就被執(zhí)行了。

當(dāng)我們采用繼承Thread的方式實(shí)現(xiàn)線程時(shí),線程的這個(gè)run()方法被重寫(xiě)了,所以當(dāng)線程啟動(dòng)時(shí),執(zhí)行的是這個(gè)對(duì)象自身的 run()方法。

總結(jié)起來(lái):如果我們采用的是繼承Thread類的方式,那么這個(gè)target就是線程對(duì)象自身,如果我們采用的是實(shí)現(xiàn)Runnable接口的方式,那么這個(gè)target就是實(shí)現(xiàn)了Runnable接口的類的實(shí)例。

我們?cè)賮?lái)看一道混跡于各大面試公司筆試的題目:

public class EqualsTest {
    public static void main(String args[]) {
        Thread t = new Thread() {
            public void run() {
                pong();
            }
        }
        ;
        t.run();
        System.out.print("ping");
    }
    static void pong() {
        System.out.print("pong");
    }
}

這里的標(biāo)準(zhǔn)答案是:pongping

這里直接調(diào)用線程的run方法,就相當(dāng)于調(diào)用普通方法一樣,由上往下執(zhí)行,所以最后的結(jié)果是pongping。但是如果上面改成t.start()之后,這個(gè)結(jié)果就不固定了,因?yàn)檫@里有兩個(gè)線程(其實(shí)還有一個(gè)守護(hù)線程,這里就先忽略),main線程和 t 線程,這兩個(gè)線程獲得cpu的時(shí)間就會(huì)不固定了,誰(shuí)先獲得CPU執(zhí)行權(quán),誰(shuí)就先打印結(jié)果,所以最后的結(jié)果可能pongping也可能是pingpong。

寫(xiě)在最后

阿里后端Java面試題:?jiǎn)?dòng)線程是start()還是run()?為什么?

網(wǎng)站標(biāo)題:阿里后端Java面試題:?jiǎn)?dòng)線程是start()還是run()?為什么?
轉(zhuǎn)載注明:http://muchs.cn/article24/jchoje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT外貿(mào)建站、企業(yè)網(wǎng)站制作、虛擬主機(jī)、網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作