多線程run方法執(zhí)行順序

先看一道題:以下多線程執(zhí)行的結(jié)果是什么?

new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        while (true) {
                            try {
                                Thread.sleep(2000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            System.out.println("1");
                        }
                    }
                }
        ) {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("2");
                }
            }
        }.start();

看這個之前,我們先看一下java中,Thread是怎么實現(xiàn)run方法的。
我們先看第二張圖,當(dāng)target(Runnable)不為空的時候,run方法才會被執(zhí)行。

Thread 實現(xiàn)Runnable接口
Thread 重寫run方法

我們把上面代碼精簡一下,可以得到如下代碼:

 new Thread(runnable.run()){   
            run()    
        }.start();

首先 Thread執(zhí)行start()的時候,會先去執(zhí)行自己的run()方法,只有當(dāng)自己的run()為空的時候,才會去執(zhí)行父類的runnable,因此上文被執(zhí)行的是System.out.println("2"); 父類此時被子類覆蓋了。

 new Thread(runnable.run()){   //只有當(dāng)自己的run()為空的時候才會被執(zhí)行
            run()     //第一個被執(zhí)行
        }.start();

多線程的兩種方式

  • 繼承Thread
  • 實現(xiàn) Runnable接口

//Thread的子類
        Thread thread = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                }
            }
        };
        thread.start();

 //第二個線程 實現(xiàn)Runnable
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                }
            }
        });
        thread2.start();

注意:
以上為Demo,只演示代碼,但是會造成死循環(huán)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 多線程并發(fā)編程是Java編程中重要的一塊內(nèi)容,也是面試重點覆蓋區(qū)域,所以學(xué)好多線程并發(fā)編程對我們來說極其重要...
    嘟爺MD閱讀 7,412評論 21 272
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,644評論 18 399
  • jQuery很強大,一部分原因是強大在選擇器上。。。它能夠很輕易地拿到 HTML 元素組或單個元素,然后進(jìn)行各種進(jìn)...
    Ke_Wang閱讀 472評論 0 6
  • 我們爭先恐后地坐上了駛向未來的火車,卻不知道它會開到哪里去 你覺得孤獨就對了,那是讓你認(rèn)識自己的機會。 你覺得不被...
    夜空上的流浪云閱讀 660評論 0 1
  • 帕特里克曾說,不自由,毋寧死。 盧梭曾說,人生而自由,但無往不在枷鎖之中。 她便是戴著鐐銬跳舞的舞者,她不停歇的舞...
    一米二的洞穴閱讀 366評論 0 0

友情鏈接更多精彩內(nèi)容