溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Thread的start和run方法的區別是什么

發布時間:2021-12-17 15:59:34 來源:億速云 閱讀:165 作者:柒染 欄目:編程語言

這篇文章將為大家詳細講解有關Thread的start和run方法的區別是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

Thread中的start()和run()是Java的多線程概念最重要的兩個方法,相信大家在Java學習中,或多或少會對兩者的區別搞不清楚。因此小編就來和大家談談start和run方法,主要內容包括:認識start和run方法、兩者的區別、代碼實例和線程狀態說明。

一、認識Thread的start和run方法。

1、Java中的start()方法是什么?

線程類的start()方法可以用來啟動線程;該方法會在內部調用Runnable接口的run()方法,以在單獨的線程中執行run()方法中指定的代碼。

start()方法啟動線程執行以下任務:

它統計了一個新線程

線程從New State移動到Runnable狀態。

當線程有機會執行時,它的目標run()方法將運行。

2、Java中的run()方法是什么?

線程類的run()方法是Runnable接口的一個抽象方法,由java虛擬機直接調用的,不會創建的新線程。

二、start()方法和run()方法的區別。

1、方法的定義

start()方法在java.lang.Thread類中定義;而,run()方法在java.lang.Runnable接口中定義,必須在實現類中重寫。

2、新線程創建

當程序調用start()方法時,會創建一個新線程,然后執行run()方法。但是如果我們直接調用run()方法,則不會創建新的線程,run()方法將作為當前調用線程本身的常規方法調用執行,并且不會發生多線程。

3、多次調用

start()方法不能多次調用,否則拋出java.lang.IllegalStateException;而,run()方法可以進行多次調用,因為它只是一種正常的方法調用。

三、代碼實例:

通過start啟動線程,異步啟動

public static void?main(String args[]) {

Thread t = new?Thread() {

public void?run() {

pong();

}

};

t.start();

System.out.print("ping");

}

static?void?pong() {

System.out.print("pong");

}

輸出結果: pingpong

通過run啟動線程,同步啟動

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

通過以上兩個程序實例,可以很容易的區分出start()方法和run()方法的區別:

t.start(); 該行代碼相當于是啟動線程,異步操作

t.run(); 該行代碼相當于是使用t這個類中的run方法而已,只是主線程的一個普通的方法

四、線程狀態說明

線程狀態從大的方面來說,可歸結為:初始狀態、可運行狀態、不可運行狀態和消亡狀態,說明如下:

1)線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口,但不管怎樣,當我們new了thread實例后,線程就進入了初始狀態;

2)當該對象調用了start()方法,就進入可運行狀態;

3)進入可運行狀態后,當該對象被操作系統選中,獲得CPU時間片就會進入運行狀態;

4)進入運行狀態后情況就比較多,大致有如下情形:

a. run()方法或main()方法結束后,線程就進入終止狀態;

b. 當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但并不釋放所占有的資源)。當sleep()結束或join()結束后,該線程進入可運行狀態,繼續等待OS分配時間片; 當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被鎖(synchroniza,lock),將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池里也許已經有了其他線程在等待獲取鎖標記,這時它們處于隊列狀態,既先到先得),一旦線程獲得鎖標記后,就轉入可運行狀態,等待OS分配 CPU時間片;

c. 當線程調用wait()方法后會進入等待隊列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態后,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由于notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒后會進入鎖池,等待獲取鎖標記。 當線程調用stop方法,即可使線程進入消亡狀態,但是由于stop方法是不安全的,不鼓勵使用,大家可以通過run方法里的條件變通實現線程的 stop。

關于Thread的start和run方法的區別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女