程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java根本教程之Thread中start()和run()的差別 java多線程教程

java根本教程之Thread中start()和run()的差別 java多線程教程

編輯:關於JAVA

java根本教程之Thread中start()和run()的差別 java多線程教程。本站提示廣大學習愛好者:(java根本教程之Thread中start()和run()的差別 java多線程教程)文章只能為提供參考,不一定能成為您想要的結果。以下是java根本教程之Thread中start()和run()的差別 java多線程教程正文


Thread類包括start()和run()辦法,它們的差別是甚麼?本章將對此作出解答。本章內容包含:
start() 和 run()的差別解釋
start() 和 run()的差別示例
start() 和 run()相干源碼(基於JDK1.7.0_40)

start() 和 run()的差別解釋
start() : 它的感化是啟動一個新線程,新線程會履行響應的run()辦法。start()不克不及被反復挪用。
run()   : run()就和通俗的成員辦法一樣,可以被反復挪用。零丁挪用run()的話,會在以後線程中履行run(),而其實不會啟動新線程!

 

上面以代碼來停止解釋。


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

mythread.start()會啟動一個新線程,並在新線程中運轉run()辦法。
而mythread.run()則會直接在以後線程中運轉run()辦法,其實不會啟動一個新線程來運轉run()。

 

start() 和 run()的差別示例
上面,經由過程一個簡略示例演示它們之間的差別。源碼以下:


public synchronized void start() {
    // 假如線程不是"停當狀況",則拋出異常!
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

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

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

運轉成果:

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

成果解釋:
(01) Thread.currentThread().getName()是用於獲得“以後線程”的名字。以後線程是斧正在cpu中調劑履行的線程。
(02) mythread.run()是在“主線程main”中挪用的,該run()辦法直接運轉在“主線程main”上。
(03) mythread.start()會啟動“線程mythread”,“線程mythread”啟動以後,會挪用run()辦法;此時的run()辦法是運轉在“線程mythread”上。

 

start() 和 run()相干源碼(基於JDK1.7.0_40)
Thread.java中start()辦法的源碼以下:


public synchronized void start() {
    // 假如線程不是"停當狀況",則拋出異常!
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

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

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

解釋:start()現實上是經由過程當地辦法start0()啟動線程的。而start0()會新運轉一個線程,新線程會挪用run()辦法。

private native void start0();


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


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

解釋:target是一個Runnable對象。run()就是直接挪用Thread線程的Runnable成員的run()辦法,其實不會新建一個線程。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved