91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

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

這篇文章將為大家詳細講解有關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

谷城县| 穆棱市| 洱源县| 清水县| 民权县| 黑河市| 佛冈县| 尚志市| 玉溪市| 黄浦区| 永州市| 巨鹿县| 黄山市| 昆明市| 邢台县| 库伦旗| 当涂县| 高青县| 襄城县| 宜城市| 浦县| 洪江市| 石阡县| 察雅县| 麻栗坡县| 桂林市| 潜山县| 峨边| 黄平县| 连平县| 龙井市| 五河县| 玉屏| 宁化县| 元阳县| 仙游县| 千阳县| 肇源县| 武城县| 托里县| 建平县|