一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - java基本教程之Thread中start()和run()的區(qū)別 java多線程教程

java基本教程之Thread中start()和run()的區(qū)別 java多線程教程

2019-10-31 14:47java教程網(wǎng) JAVA教程

這篇文章主要介紹了Thread中start()和run()的區(qū)別,Thread類包含start()和run()方法,它們的區(qū)別是什么?下面將對此作出解答

Thread類包含start()和run()方法,它們的區(qū)別是什么?本章將對此作出解答。本章內(nèi)容包括:
start() 和 run()的區(qū)別說明
start() 和 run()的區(qū)別示例
start() 和 run()相關(guān)源碼(基于JDK1.7.0_40)

start() 和 run()的區(qū)別說明
start() : 它的作用是啟動一個新線程,新線程會執(zhí)行相應(yīng)的run()方法。start()不能被重復(fù)調(diào)用。
run()   : run()就和普通的成員方法一樣,可以被重復(fù)調(diào)用。單獨調(diào)用run()的話,會在當(dāng)前線程中執(zhí)行run(),而并不會啟動新線程!

 

下面以代碼來進行說明。

 

復(fù)制代碼代碼如下:

class MyThread extends Thread{  
    public void run(){
        ...
    } 
};
MyThread mythread = new MyThread();

 

mythread.start()會啟動一個新線程,并在新線程中運行run()方法。
而mythread.run()則會直接在當(dāng)前線程中運行run()方法,并不會啟動一個新線程來運行run()。

 

start() 和 run()的區(qū)別示例
下面,通過一個簡單示例演示它們之間的區(qū)別。源碼如下:

 

復(fù)制代碼代碼如下:


public synchronized void start() {
    // 如果線程不是"就緒狀態(tài)",則拋出異常!
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

 

    // 將線程添加到ThreadGroup中
    group.add(this);

    boolean started = false;
    try {
        // 通過start0()啟動線程
        start0();
        // 設(shè)置started標記
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}

 

運行結(jié)果:

復(fù)制代碼代碼如下:

main call mythread.run()
main is running
main call mythread.start()
mythread is running

 

結(jié)果說明:
(01) Thread.currentThread().getName()是用于獲取“當(dāng)前線程”的名字。當(dāng)前線程是指正在cpu中調(diào)度執(zhí)行的線程。
(02) mythread.run()是在“主線程main”中調(diào)用的,該run()方法直接運行在“主線程main”上。
(03) mythread.start()會啟動“線程mythread”,“線程mythread”啟動之后,會調(diào)用run()方法;此時的run()方法是運行在“線程mythread”上。

 

start() 和 run()相關(guān)源碼(基于JDK1.7.0_40)
Thread.java中start()方法的源碼如下:

 

復(fù)制代碼代碼如下:


public synchronized void start() {
    // 如果線程不是"就緒狀態(tài)",則拋出異常!
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

 

    // 將線程添加到ThreadGroup中
    group.add(this);

    boolean started = false;
    try {
        // 通過start0()啟動線程
        start0();
        // 設(shè)置started標記
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}

 

說明:start()實際上是通過本地方法start0()啟動線程的。而start0()會新運行一個線程,新線程會調(diào)用run()方法。

復(fù)制代碼代碼如下:

private native void start0();



Thread.java中run()的代碼如下:

 

 

復(fù)制代碼代碼如下:

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


說明:target是一個Runnable對象。run()就是直接調(diào)用Thread線程的Runnable成員的run()方法,并不會新建一個線程。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色偷偷亚洲综合网亚洲 | 国产综合亚洲欧美日韩一区二区 | 国产精品制服丝袜白丝www | 国产拍拍拍 | 黑人性xxxⅹxxbbbbb| 亚洲天堂成人在线 | 亚洲黄视频在线观看 | 欧美精品综合一区二区三区 | 日本强不卡在线观看 | 人人精品久久 | 精品无人乱码一区二区三区 | 4438全国最大成人网视频 | 香蕉精品 | 精品老司机在线视频香蕉 | 精品欧美一区二区精品久久 | 32pao强力打造免费高速高 | 午夜精品久久久久久久2023 | 99热这里有精品 | 国产精品永久免费自在线观看 | 激情三级hd中文字幕 | 亚洲成人福利 | 91影视在线看免费观看 | 欧美日韩在线观看一区二区 | 亚洲www视频 | 国产在线99 | 脱女学小内内摸出水网站免费 | 黑人开嫩苞 | 日韩亚洲人成在线综合 | 视频一区二区三区在线 | 国产精品亚洲午夜一区二区三区 | 欧美高清无砖专区欧美精品 | 我的男友是消防员在线观看 | 亚洲欧美在线免费观看 | 午夜在线观看免费观看 视频 | 俄罗斯三级在线观看级 | 91综合久久| 日本一区二区三区四区无限 | 夫承子液by免费阅读 | 欧美午夜寂寞影院安卓列表 | 亚洲视频日韩 | 国产成人亚洲精品乱码在线观看 |