成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java Thread的概述與總結

開發 后端
線程是一個程序的多個執行路徑,執行調度的單位,依托于進程存在。 線程不僅可以共享進程的內存,而且還擁有一個屬于自己的內存空間,這段內存空間也叫做線程棧,是在建立線程時由系統分配的,主要用來保存線程內部所使用的數據,如線程執行函數中所定義的變量。

線程的概述(Introduction)

線程是一個程序的多個執行路徑,執行調度的單位,依托于進程存在。 線程不僅可以共享進程的內存,而且還擁有一個屬于自己的內存空間,這段內存空間也叫做線程棧,是在建立線程時由系統分配的,主要用來保存線程內部所使用的數據,如線程執行函數中所定義的變量。

注意:Java中的多線程是一種搶占機制而不是分時機制。搶占機制指的是有多個線程處于可運行狀態,但是只允許一個線程在運行,他們通過競爭的方式搶占CPU。

線程的定義(Defining)

定義一個線程(Defining a Thread)有兩種方法

1) 繼承java.lang.Thread類

  1. /**  
  2.  * 使用繼承java.lang.Thread類的方式創建一個線程  
  3.  *   
  4.  * @author DreamSea 2011-12-29 20:17:06  
  5.  */ 
  6. public class ThreadTest extends Thread {  
  7.  
  8.     /**  
  9.      * 重寫(Override)run()方法 JVM會自動調用該方法  
  10.      */ 
  11.     public void run() {  
  12.         System.out.println("I'm running!");  
  13.     }  

注意:重寫(override)run()方法在該線程的start()方法被調用后,JVM會自動調用run方法來執行任務;但是重載(overload)run()方法,該方法和普通的成員方法一樣,并不會因調用該線程的start()方法而被JVM自動運行。 例如:

  1. public class ThreadTest extends Thread {  
  2.  
  3.     /**  
  4.      * 重寫(Override)run()方法 JVM會自動調用該方法  
  5.      */ 
  6.     @Override 
  7.     public void run() {  
  8.         System.out.println("I'm running!");  
  9.     }  
  10.  
  11.     /**  
  12.      * 重載(Overload)run()方法 和普通的方法一樣,并不會在該線程的start()方法被調用后被JVM自動運行  
  13.      */ 
  14.     public void run(int times) {  
  15.         System.out.println("I'm running!(Overload)");  
  16.     }  

不建議使用此方法定義線程,因為采用繼承Thread的方式定義線程后,你不能在繼承其他的類了,導致程序的可擴展性大大降低。

2) 實現java.lang.Runnable接口

  1. /**  
  2.  * 通過實現Runnable接口創建一個線程  
  3.  * @author DreamSea  
  4.  */ 
  5. public class ThreadTest implements Runnable {  
  6.     public void run() {  
  7.             System.out.println("I'm running!");  
  8.     }  

線程的啟動(Starting)

任何一個線程的執行的前提都是必須有Thread class的實例存在,并且通過調用run()方法啟動線程。

1)如果線程是繼承Thread類,則創建方式如下:

  1. ThreadTest1 tt = new ThreadTest1();  
  2. tt.start(); 

2)如果是實現Runnable接口,則創建方式如下:

  1. ThreadTest2 tt = new ThreadTest2();  
  2. Thread t = new Thread(tt);  
  3. t.start(); 

線程的狀態(State)

新生狀態(New): 當一個線程的實例被創建即使用new關鍵字和Thread類或其子類創建一個線程對象后,此時該線程處于新生(new)狀態,處于新生狀態的線程有自己的內存空間,但該線程并沒有運行,此時線程還不是活著的(not alive);

就緒狀態(Runnable): 通過調用線程實例的start()方法來啟動線程使線程進入就緒狀態(runnable);處于就緒狀態的線程已經具備了運行條件,但還沒有被分配到CPU即不一定會被立即執行,此時處于線程就緒隊列,等待系統為其分配CPCU,等待狀態并不是執行狀態; 此時線程是活著的(alive);

運行狀態(Running): 一旦獲取CPU(被JVM選中),線程就進入運行(running)狀態,線程的run()方法才開始被執行;在運行狀態的線程執行自己的run()方法中的操作,直到調用其他的方法而終止、或者等待某種資源而阻塞、或者完成任務而死亡;如果在給定的時間片內沒有執行結束,就會被系統給換下來回到線程的等待狀態;此時線程是活著的(alive);

阻塞狀態(Blocked):通過調用join()、sleep()、wait()或者資源被暫用使線程處于阻塞(blocked)狀態;處于Blocking狀態的線程仍然是活著的(alive)

死亡狀態(Dead):當一個線程的run()方法運行完畢或被中斷或被異常退出,該線程到達死亡(dead)狀態。此時可能仍然存在一個該Thread的實例對象,當該Thready已經不可能在被作為一個可被獨立執行的線程對待了,線程的獨立的call stack已經被dissolved。一旦某一線程進入Dead狀態,他就再也不能進入一個獨立線程的生命周期了。對于一個處于Dead狀態的線程調用start()方法,會出現一個運行期(runtime exception)的異常;處于Dead狀態的線程不是活著的(not alive)。

線程狀態圖

線程的方法(Method)、屬性(Property)

1)優先級(priority)

每個類都有自己的優先級,一般property用1-10的整數表示,默認優先級是5,優先級***是10;優先級高的線程并不一定比優先級低的線程執行的機會高,只是執行的機率高;默認一個線程的優先級和創建他的線程優先級相同;

2)Thread.sleep()/sleep(long millis)

當前線程睡眠/millis的時間(millis指定睡眠時間是其最小的不執行時間,因為sleep(millis)休眠到達后,無法保證會被JVM立即調度);sleep()是一個靜態方法(static method) ,所以他不會停止其他的線程也處于休眠狀態;線程sleep()時不會失去擁有的對象鎖。 作用:保持對象鎖,讓出CPU,調用目的是不讓當前線程獨自霸占該進程所獲取的CPU資源,以留一定的時間給其他線程執行的機會;

3)Thread.yield()

讓出CPU的使用權,給其他線程執行機會、讓同等優先權的線程運行(但并不保證當前線程會被JVM再次調度、使該線程重新進入Running狀態),如果沒有同等優先權的線程,那么yield()方法將不會起作用。

4)thread.join()

使用該方法的線程會在此之間執行完畢后再往下繼續執行。

5)object.wait()

當一個線程執行到wait()方法時,他就進入到一個和該對象相關的等待池(Waiting Pool)中,同時失去了對象的機鎖—暫時的,wait后還要返還對象鎖。當前線程必須擁有當前對象的鎖,如果當前線程不是此鎖的擁有者,會拋出IllegalMonitorStateException異常,所以wait()必須在synchronized block中調用。

6)object.notify()/notifyAll()

喚醒在當前對象等待池中等待的***個線程/所有線程。notify()/notifyAll()也必須擁有相同對象鎖,否則也會拋出IllegalMonitorStateException異常。

7)Synchronizing Block

Synchronized Block/方法控制對類成員變量的訪問;Java中的每一個對象都有唯一的一個內置的鎖,每個Synchronized Block/方法只有持有調用該方法被鎖定對象的鎖才可以訪問,否則所屬線程阻塞;機鎖具有獨占性、一旦被一個Thread持有,其他的Thread就不能再擁有(不能訪問其他同步方法),方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此后被阻塞的線程方能獲得該鎖,重新進入可執行狀態。

原文鏈接:http://www.cnblogs.com/DreamSea/archive/2012/01/11/JavaThread.html#Priority

【編輯推薦】

  1. Java之線程池簡單實現
  2. Java回調函數的理解
  3. Java路線圖:甲骨文的兩年計劃
  4. Java 8將支持無符號整型
  5. 淺析Swing線程模型和EDT
責任編輯:林師授 來源: DreamSea的博客
相關推薦

2011-08-18 13:57:47

Star Schema

2019-12-20 14:21:26

JVM調優垃圾回收

2014-06-11 10:29:03

2012-08-09 09:42:23

HadoopNoSQL實施

2011-11-18 15:18:41

Junit單元測試Java

2009-09-01 15:08:07

C#命名規范

2009-08-28 17:00:50

C# for

2021-09-13 07:58:52

考試算法PAT

2012-05-07 10:40:57

阿里巴巴去IOE

2018-11-26 08:49:42

CPU排查負載

2023-06-19 07:27:50

網易嚴選全鏈路

2013-07-05 16:37:50

數據丟失故障排查

2017-12-27 14:09:47

云計算數據中心混合云

2009-02-21 19:17:54

CCIE Lab面試思科

2021-06-30 07:51:09

新項目領域建模

2017-04-19 11:15:01

Oracle數據庫備份恢復

2021-06-09 15:55:34

Oracle賬號鎖定

2011-08-18 09:19:19

SQL Server的SQL查詢優化

2011-08-22 17:18:53

SQL ServerOracleDB2

2018-04-10 14:17:09

藍綠發布滾動發布灰度發布
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人综合亚洲欧美94在线 | 亚洲国产精品99久久久久久久久 | 日本午夜精品 | 天天操人人干 | 日韩在线小视频 | 国产精品久久av | av一二三四| 欧美国产精品 | 精品一二三区 | 成人毛片在线视频 | 亚洲综合国产精品 | 亚洲一区二区三区免费在线观看 | 久久99精品久久久 | 亚洲精品免费在线观看 | 美女逼网站 | 欧美一区二区三区视频在线播放 | a级黄色片视频 | 欧美一区二区在线观看 | 亚洲一区久久久 | 成人三级视频 | 天天干天天操 | 精品国产免费人成在线观看 | 中文在线观看视频 | 亚洲欧美日韩久久久 | 亚洲网站在线播放 | 成人精品国产 | 91在线视频一区 | 日韩成人在线看 | 人人叉| 欧美精品在线免费观看 | 日本一卡精品视频免费 | 欧美精品一区二区三区在线播放 | 国产小视频在线观看 | 国产精品特级毛片一区二区三区 | 中文字幕欧美日韩一区 | 综合久久久 | 精品成人av | 嫩呦国产一区二区三区av | 日本不卡一二三 | 中文字幕乱码一区二区三区 | 国产激情福利 |