1. 程式人生 > >Thread類:run和start方法的區別

Thread類:run和start方法的區別

run和start方法,有時候會被當成起一個新的執行緒執行程式碼邏輯,來達到程式非同步執行的效果。

(1)程式呼叫run方法:

public class ExtendThread extends Thread{


@Override
public void run() {
// TODO Auto-generated method stub
try {
//打印出執行緒數
System.out.println("run方法列印執行緒數:"+Thread.currentThread().activeCount());
Thread.sleep(2000);
System.out.println("ExtendThread run over");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void main(String[] args) {
ExtendThread thread = new ExtendThread();
thread.run();//呼叫run方法
//thread.start();//呼叫start方法
//打印出執行緒數
System.out.println("main方法列印執行緒數:"+Thread.currentThread().activeCount());
}

}

執行結果:

run方法列印執行緒數:1

ExtendThread run over

main方法列印執行緒數:1

結論: 1.呼叫run方法,不會起新的執行緒;

           2.程式模組同步執行,先執行ExtendThread的run方法,再輸出主程式main方法的列印資訊。

(2)程式改呼叫start方法

public class ExtendThread extends Thread{


@Override
public void run() {
// TODO Auto-generated method stub
try {
//打印出執行緒數
System.out.println("run方法列印執行緒數:"+Thread.currentThread().activeCount());
Thread.sleep(2000);
System.out.println("ExtendThread run over");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void main(String[] args) {
ExtendThread thread = new ExtendThread();
//thread.run();//呼叫run方法
thread.start();//呼叫start方法
//打印出執行緒數
System.out.println("main方法列印執行緒數:"+Thread.currentThread().activeCount());
}

}

執行結果:

main方法列印執行緒數:2
run方法列印執行緒數:2

ExtendThread run over

結論: 1.呼叫start方法,會起新的執行緒;

           2.程式模組非同步執行,同時執行ExtendThread的run方法,和輸出主程式main方法的列印資訊。

(3)其實,從start原始碼方法註釋可以得出以下三點結論:

        1.main方法呼叫start方法,會讓java虛擬機器呼叫run方法。

        2.start的執行結果,是會有兩個在跑的執行緒,意思就是會新啟動一個執行緒

        3.start方法不能連續呼叫多次,否則會報java.lang.IllegalThreadStateException異常。

        而呼叫run方法,則只是呼叫重寫的run方法,不會重啟執行緒

       /**
     * Causes this thread to begin execution; the Java Virtual Machine
     * calls the <code>run</code> method of this thread.
     * <p>
     * The result is that two threads are running concurrently: the
     * current thread (which returns from the call to the
     * <code>start</code> method) and the other thread (which executes its
     * <code>run</code> method).
     * <p>
     * It is never legal to start a thread more than once.
     * In particular, a thread may not be restarted once it has completed
     * execution.
     *
     * @exception  IllegalThreadStateException  if the thread was already
     *               started.
     * @see        #run()
     * @see        #stop()
     */

    public synchronized void start(){

        /** 略**/

    }

相關推薦

Threadrunstart方法區別

run和start方法,有時候會被當成起一個新的執行緒執行程式碼邏輯,來達到程式非同步執行的效果。(1)程式呼叫run方法:public class ExtendThread extends Thread{@Overridepublic void run() {// TODO

java面試題之Threadrun()start()方法有什麼區別

run()方法:   是在主執行緒中執行方法,和呼叫普通方法一樣;(按順序執行,同步執行) start()方法:   是建立了新的執行緒,在新的執行緒中執行;(非同步執行)   public class App { public static void main( Stri

thread run start區別

麻煩 [] 執行 兩種方法 會有 其它 定義 thread類 http run 方法 也可以調用線程啟動 但是單線程(為順序執行) 而start方法 啟動的線程為多個線程之間爭奪cpu的執行權(為隨機的) 摘錄於 http://www.cnblogs.com/sun

runnablethread區別以及runstart區別(多執行緒)

在java中可有兩種方式實現多執行緒,一種是繼承Thread類,一種是實現Runnable介面;Thread類是在java.lang包中定義的。一個類只要繼承了Thread類同時覆寫了本類中的run()方法就可以實現多執行緒操作了,但是一個類只能繼承一個父類,這是此方法的

關於多執行緒runstart區別

一、先簡單描敘一下建立執行緒的方式通過繼承Thread: (1)定義一個類繼承Thread類 (2)覆蓋Thread類中的run方法 (3)直接建立Thread的子類物件執行緒 (4)呼叫start方法開啟執行緒並呼叫執行緒的任務run方法執行 public class T

java多執行緒run()start()的區別

其實,run()和start()區別很簡單。 當你啟動執行緒,使用start(),系統會把run()方法當成執行緒執行體來處理,這是正常的,也是正確的情況。但是,當你啟動執行緒時,呼叫run()方法,系統run()方法會立即執行,但是這時候系統會把run()方法當成普通的方

Java線程RunStart區別

dsta for 調用 bubuko bool oid art not in package 先上結論:run只是Thread裏面的一個普通方法,start是啟動線程的方法。何以見得呢?可以執行下面的代碼看看run和start的區別: package com.basi

java中Threadrun()方法start()方法區別

run方法:不啟動新執行緒 public void run() { if (target != null) { target.run(); } } start()方法:啟動一個執行緒 public synchronized void start()

Java Thread中,run方法start方法區別

bsp 區別 繼續 時間片 ron thread類 等待 nbsp art 兩種方法的區別: 1.start方法 用 start方法來啟動線程,是真正實現了多線程, 通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒

run()方法start()方法區別

個人部落格:小景哥哥 run()方法和start()方法的區別 系統呼叫執行緒類的start()方法來啟動一個執行緒,此時該執行緒處於就緒狀態,而非執行狀態,也就意味著這個執行緒可以被JVM來排程執行。在排程過程中,JVM通過呼叫執行緒類的run()方法來完成實際的操作,當run

多執行緒 -- run()方法start()方法區別

一. 直接呼叫run()方法 public class Two_Thread implements Runnable { public static void main(String[] args) { // TODO Auto-generated method

Thread的sleep()方法物件的wait()方法都能使執行緒暫停執行,他們有什麼區別

sleep()方法是執行緒類Thread的靜態方法,呼叫該方法使執行緒暫停執行指定的時間,將CPU讓給其他執行緒,並不釋放所持有的物件鎖,休眠時間結束後執行緒回到就緒狀態。 wait()是Object類的方法,呼叫wait()方法,執行緒釋放所持有的物件鎖,進入等待池中,只

JAVA中分為基本數據型及引用數據型(問題棧的區別,系統根據什麽區分堆棧內存)

復雜 復合 小寫 name 布爾 語言 內存空間 結構 抽象 一、基本數據類型: byte:Java中最小的數據類型,在內存中占8位(bit),即1個字節,取值範圍-128~127,默認值0 short:短整型,在內存中占16位,即2個字節,取值範圍-32768~32717

http請求方法GETPOST 的區別

  GET方式:將表單內容經過編碼之後 ,通過URL傳送, 使用get方式傳送時有255個字元的限制。 POST方式:將表單的內容通過http傳送,post沒有字元長度的限制 使用GET和POST方式傳遞引數 在URL地址後面可以附加一些引數 舉例:h

iOS的方法例項方法區別與使用 + -

1.什麼是類方法? 在OC類定義方法時以 + 開頭的方法,又稱為靜態方法。如:+ (viod)方法名{ }. 作用:不用例項話就可以直接呼叫的方法,一般是有返回值的,返回對應的例項(陣列、字串等),還有可能就是本身類的例項物件。常用於一些common或者UtiKit等公共方法類中。如對N

Mybatis 中更新方法 updateByPrimaryKeySelective() updateByPrimaryKey() 的區別

int updateByPrimaryKeySelective(TbItem record); int updateByPrimaryKey(TbItem record); 上面的是逆轉工程生成的Mapper介面 對應的xml為 <update id="updateByPrima

run()start()區別

通常,系統通過呼叫執行緒類的start()方法來啟動一個執行緒,此時該執行緒就處於就緒狀態,而非執行狀態,也就意味著這個執行緒可以被jvm來排程執行。在排程過程中,JVM通過呼叫執行緒類的run()方法來完成實際的操作,當run()方法結束後此執行緒就會終止。 如果直接呼叫執行緒類的ru

關於Java File中 mkdir() mkdirs() 方法區別使用方法

boolean mkdirs() 方法可以建立此抽象路徑的指定目錄,如在D盤建立一個D:\\JavaStudy\\FileStudy,即使這兩個目錄並不存在也可以一併進行建立。可用於建立多級目錄。

iOS的方法例項方法區別與使用

1.什麼是類方法? 在OC類定義方法時以 + 開頭的方法,又稱為靜態方法。如:+ (viod)方法名{ }. 作用:不用例項話就可以直接呼叫的方法,一般是有返回值的,返回對應的例項(陣列、字串等),還有可能就是本身類的例項物件。常用於一些common或者UtiK

Python中列表的方法append()extend()的區別還有pop()remove()的區別

1、 append()和extend()的區別append 和extend都是列表的方法之一,共同點都是在列表的左後新增列表的元素,區別在於append()是將要新增的物件作為一個整體新增到列表中,被新增的物件最終做為原列表的一個元素,extend()方法則是將一個可迭代物件