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

問題

站在用戶的角度思考問題,與客戶深入溝通,找到杜爾伯特網(wǎng)站設計與杜爾伯特網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設計、網(wǎng)站建設、外貿(mào)網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、雅安服務器托管、企業(yè)郵箱。業(yè)務覆蓋杜爾伯特地區(qū)。

面試官:請問啟動線程是start()還是run()方法,能談談嗎?

應聘者:start()方法

當用start()開始一個線程后,線程就進入就緒狀態(tài),使線程所代表的虛擬處理機處于可運行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。但是這并不意味著線程就會立即運行。只有當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!");
  }
}

實現(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!");
  }
}

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

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

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

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

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

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

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");
  }
}

這里的標準答案是:pongping

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

本文標題:JAVA面試題start()和run()詳解
鏈接URL:http://muchs.cn/article22/jpegcc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、自適應網(wǎng)站、定制開發(fā)靜態(tài)網(wǎng)站、App設計、定制網(wǎng)站

廣告

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

成都做網(wǎng)站