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

Java Thread的概述與總結(jié)

開發(fā) 后端
線程是一個(gè)程序的多個(gè)執(zhí)行路徑,執(zhí)行調(diào)度的單位,依托于進(jìn)程存在。 線程不僅可以共享進(jìn)程的內(nèi)存,而且還擁有一個(gè)屬于自己的內(nèi)存空間,這段內(nèi)存空間也叫做線程棧,是在建立線程時(shí)由系統(tǒng)分配的,主要用來保存線程內(nèi)部所使用的數(shù)據(jù),如線程執(zhí)行函數(shù)中所定義的變量。

線程的概述(Introduction)

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

注意:Java中的多線程是一種搶占機(jī)制而不是分時(shí)機(jī)制。搶占機(jī)制指的是有多個(gè)線程處于可運(yùn)行狀態(tài),但是只允許一個(gè)線程在運(yùn)行,他們通過競(jìng)爭的方式搶占CPU。

線程的定義(Defining)

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

1) 繼承java.lang.Thread類

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

注意:重寫(override)run()方法在該線程的start()方法被調(diào)用后,JVM會(huì)自動(dòng)調(diào)用run方法來執(zhí)行任務(wù);但是重載(overload)run()方法,該方法和普通的成員方法一樣,并不會(huì)因調(diào)用該線程的start()方法而被JVM自動(dòng)運(yùn)行。 例如:

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

不建議使用此方法定義線程,因?yàn)椴捎美^承Thread的方式定義線程后,你不能在繼承其他的類了,導(dǎo)致程序的可擴(kuò)展性大大降低。

2) 實(shí)現(xiàn)java.lang.Runnable接口

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

線程的啟動(dòng)(Starting)

任何一個(gè)線程的執(zhí)行的前提都是必須有Thread class的實(shí)例存在,并且通過調(diào)用run()方法啟動(dòng)線程。

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

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

2)如果是實(shí)現(xiàn)Runnable接口,則創(chuàng)建方式如下:

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

線程的狀態(tài)(State)

新生狀態(tài)(New): 當(dāng)一個(gè)線程的實(shí)例被創(chuàng)建即使用new關(guān)鍵字和Thread類或其子類創(chuàng)建一個(gè)線程對(duì)象后,此時(shí)該線程處于新生(new)狀態(tài),處于新生狀態(tài)的線程有自己的內(nèi)存空間,但該線程并沒有運(yùn)行,此時(shí)線程還不是活著的(not alive);

就緒狀態(tài)(Runnable): 通過調(diào)用線程實(shí)例的start()方法來啟動(dòng)線程使線程進(jìn)入就緒狀態(tài)(runnable);處于就緒狀態(tài)的線程已經(jīng)具備了運(yùn)行條件,但還沒有被分配到CPU即不一定會(huì)被立即執(zhí)行,此時(shí)處于線程就緒隊(duì)列,等待系統(tǒng)為其分配CPCU,等待狀態(tài)并不是執(zhí)行狀態(tài); 此時(shí)線程是活著的(alive);

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

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

死亡狀態(tài)(Dead):當(dāng)一個(gè)線程的run()方法運(yùn)行完畢或被中斷或被異常退出,該線程到達(dá)死亡(dead)狀態(tài)。此時(shí)可能仍然存在一個(gè)該Thread的實(shí)例對(duì)象,當(dāng)該Thready已經(jīng)不可能在被作為一個(gè)可被獨(dú)立執(zhí)行的線程對(duì)待了,線程的獨(dú)立的call stack已經(jīng)被dissolved。一旦某一線程進(jìn)入Dead狀態(tài),他就再也不能進(jìn)入一個(gè)獨(dú)立線程的生命周期了。對(duì)于一個(gè)處于Dead狀態(tài)的線程調(diào)用start()方法,會(huì)出現(xiàn)一個(gè)運(yùn)行期(runtime exception)的異常;處于Dead狀態(tài)的線程不是活著的(not alive)。

線程狀態(tài)圖

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

1)優(yōu)先級(jí)(priority)

每個(gè)類都有自己的優(yōu)先級(jí),一般property用1-10的整數(shù)表示,默認(rèn)優(yōu)先級(jí)是5,優(yōu)先級(jí)***是10;優(yōu)先級(jí)高的線程并不一定比優(yōu)先級(jí)低的線程執(zhí)行的機(jī)會(huì)高,只是執(zhí)行的機(jī)率高;默認(rèn)一個(gè)線程的優(yōu)先級(jí)和創(chuàng)建他的線程優(yōu)先級(jí)相同;

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

當(dāng)前線程睡眠/millis的時(shí)間(millis指定睡眠時(shí)間是其最小的不執(zhí)行時(shí)間,因?yàn)閟leep(millis)休眠到達(dá)后,無法保證會(huì)被JVM立即調(diào)度);sleep()是一個(gè)靜態(tài)方法(static method) ,所以他不會(huì)停止其他的線程也處于休眠狀態(tài);線程sleep()時(shí)不會(huì)失去擁有的對(duì)象鎖。 作用:保持對(duì)象鎖,讓出CPU,調(diào)用目的是不讓當(dāng)前線程獨(dú)自霸占該進(jìn)程所獲取的CPU資源,以留一定的時(shí)間給其他線程執(zhí)行的機(jī)會(huì);

3)Thread.yield()

讓出CPU的使用權(quán),給其他線程執(zhí)行機(jī)會(huì)、讓同等優(yōu)先權(quán)的線程運(yùn)行(但并不保證當(dāng)前線程會(huì)被JVM再次調(diào)度、使該線程重新進(jìn)入Running狀態(tài)),如果沒有同等優(yōu)先權(quán)的線程,那么yield()方法將不會(huì)起作用。

4)thread.join()

使用該方法的線程會(huì)在此之間執(zhí)行完畢后再往下繼續(xù)執(zhí)行。

5)object.wait()

當(dāng)一個(gè)線程執(zhí)行到wait()方法時(shí),他就進(jìn)入到一個(gè)和該對(duì)象相關(guān)的等待池(Waiting Pool)中,同時(shí)失去了對(duì)象的機(jī)鎖—暫時(shí)的,wait后還要返還對(duì)象鎖。當(dāng)前線程必須擁有當(dāng)前對(duì)象的鎖,如果當(dāng)前線程不是此鎖的擁有者,會(huì)拋出IllegalMonitorStateException異常,所以wait()必須在synchronized block中調(diào)用。

6)object.notify()/notifyAll()

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

7)Synchronizing Block

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

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

【編輯推薦】

  1. Java之線程池簡單實(shí)現(xiàn)
  2. Java回調(diào)函數(shù)的理解
  3. Java路線圖:甲骨文的兩年計(jì)劃
  4. Java 8將支持無符號(hào)整型
  5. 淺析Swing線程模型和EDT
責(zé)任編輯:林師授 來源: DreamSea的博客
相關(guān)推薦

2011-08-18 13:57:47

Star Schema

2019-12-20 14:21:26

JVM調(diào)優(yōu)垃圾回收

2014-06-11 10:29:03

2011-11-18 15:18:41

Junit單元測(cè)試Java

2012-08-09 09:42:23

HadoopNoSQL實(shí)施

2009-09-01 15:08:07

C#命名規(guī)范

2012-05-07 10:40:57

阿里巴巴去IOE

2009-08-28 17:00:50

C# for

2021-09-13 07:58:52

考試算法PAT

2018-11-26 08:49:42

CPU排查負(fù)載

2023-06-19 07:27:50

網(wǎng)易嚴(yán)選全鏈路

2013-07-05 16:37:50

數(shù)據(jù)丟失故障排查

2017-12-27 14:09:47

云計(jì)算數(shù)據(jù)中心混合云

2009-02-21 19:17:54

CCIE Lab面試思科

2021-06-30 07:51:09

新項(xiàng)目領(lǐng)域建模

2017-04-19 11:15:01

Oracle數(shù)據(jù)庫備份恢復(fù)

2021-06-09 15:55:34

Oracle賬號(hào)鎖定

2011-08-18 09:19:19

SQL Server的SQL查詢優(yōu)化

2011-08-22 17:18:53

SQL ServerOracleDB2

2011-08-01 14:24:42

數(shù)據(jù)加密加密
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91新视频| 青青草原精品99久久精品66 | 国产在线一区观看 | 欧美精品在欧美一区二区少妇 | 精品亚洲一区二区 | 国产视频一区在线 | 日本亚洲欧美 | 国产www在线 | 久久精品黄色 | 日韩精品在线观看一区二区 | 日本亚洲精品成人欧美一区 | 久久久中文| 蜜桃av一区二区三区 | av网址在线播放 | av黄色在线 | 久久黄网 | 亚洲精品欧美一区二区三区 | 午夜精品一区二区三区在线视 | 免费的黄色片子 | 天天射影院 | 97精品国产97久久久久久免费 | 欧美视频日韩 | 午夜精品一区二区三区在线观看 | 一区二区三区日 | 性欧美精品一区二区三区在线播放 | 毛片在线视频 | 久久曰视频| 成人毛片视频免费 | www.久久| 精品一区在线免费观看 | 欧美二区三区 | 中文在线a在线 | 欧美电影在线观看网站 | 一区二区三区精品视频 | 欧美aaa| 久久久久精| 人人澡视频| 久久99精品久久久久蜜桃tv | 欧美日韩一区二区三区四区 | 精品乱码一区二区 | 日本午夜精品一区二区三区 |