c++ 线程什么时候run_阿里后端Java面试题:启动线程是start()还是run()?为什么?...
面試官:請問啟動線程是start()還是run()方法,能談談嗎?
應聘者:start()方法
當用start()開始一個線程后,線程就進入就緒狀態,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。但是這并不意味著線程就會立即運行。只有當cpu分配時間片時,這個線程獲得時間片時,才開始執行run()方法。start()是方法,它調用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!");}}實現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!");}}實際上這兩種啟動線程的方式原理是一樣的。首先都是調用本地方法啟動一個線程,其次是在這個線程里執行目標對象的run()方法。那么這個目標對象是什么呢?為了弄明白這個問題,我們來看看Thread類的run()方法的實現:
public void run() {if (target != null) {target.run();}}當我們采用實現Runnable接口的方式來實現線程的情況下,在調用new Thread(Runnable target)構造器時,將實現Runnable接口的類的實例設置成了線程要執行的主體所屬的目標對象target,當線程啟動時,這個實例的 run()方法就被執行了。
當我們采用繼承Thread的方式實現線程時,線程的這個run()方法被重寫了,所以當線程啟動時,執行的是這個對象自身的 run()方法。
總結起來:如果我們采用的是繼承Thread類的方式,那么這個target就是線程對象自身,如果我們采用的是實現Runnable接口的方式,那么這個target就是實現了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
這里直接調用線程的run方法,就相當于調用普通方法一樣,由上往下執行,所以最后的結果是pongping。但是如果上面改成t.start()之后,這個結果就不固定了,因為這里有兩個線程(其實還有一個守護線程,這里就先忽略),main線程和 t 線程,這兩個線程獲得cpu的時間就會不固定了,誰先獲得CPU執行權,誰就先打印結果,所以最后的結果可能pongping也可能是pingpong。
————END————
寫
在
最
后
——————————
當然是↓↓↓
- 點贊
- 轉發
- 關注
總結
以上是生活随笔為你收集整理的c++ 线程什么时候run_阿里后端Java面试题:启动线程是start()还是run()?为什么?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CEO自愿降薪98%!Zoom全球大裁员
- 下一篇: s3c2440移植MQTT