溫馨提示×

溫馨提示×

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

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

JAVA面試題 start()和run()詳解

發(fā)布時間:2020-09-14 17:55:40 來源:腳本之家 閱讀:178 作者:Java螞蟻 欄目:編程語言

問題

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

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

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

繼承Thread類的啟動方式

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接口的啟動方式

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í)際上這兩種啟動線程的方式原理是一樣的。首先都是調(diào)用本地方法啟動一個線程,其次是在這個線程里執(zhí)行目標(biāo)對象的run()方法。那么這個目標(biāo)對象是什么呢?為了弄明白這個問題,我們來看看Thread類的run()方法的實(shí)現(xiàn):

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

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

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

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

我們再來看一道混跡于各大面試公司筆試的題目:

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()之后,這個結(jié)果就不固定了,因?yàn)檫@里有兩個線程(其實(shí)還有一個守護(hù)線程,這里就先忽略),main線程和 t 線程,這兩個線程獲得cpu的時間就會不固定了,誰先獲得CPU執(zhí)行權(quán),誰就先打印結(jié)果,所以最后的結(jié)果可能pongping也可能是pingpong。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI