国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

歡迎使用CSDN-markdown編輯器

2019-11-10 22:19:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

java線(xiàn)程

線(xiàn)程是指進(jìn)程中的一個(gè)執(zhí)行流程,一個(gè)進(jìn)程中可以運(yùn)行多個(gè)線(xiàn)程。線(xiàn)程總是屬于某個(gè)進(jìn)程,進(jìn)程中的多個(gè)線(xiàn)程共享進(jìn)程的內(nèi)存。

概念及類(lèi)別:

線(xiàn)程總體分兩類(lèi):用戶(hù)線(xiàn)程和守護(hù)線(xiàn)程。

守護(hù)線(xiàn)程概念:后臺(tái)線(xiàn)程主要是為其它線(xiàn)程(相對(duì)可以稱(chēng)之為前臺(tái)線(xiàn)程)提供服務(wù),或”守護(hù)線(xiàn)程”。如JVM中的垃圾回收線(xiàn)程。 生命周期:當(dāng)所有的前臺(tái)線(xiàn)程都進(jìn)入死亡狀態(tài)時(shí),后臺(tái)線(xiàn)程會(huì)自動(dòng)死亡

生命周期及五種基本狀態(tài):

關(guān)于Java中線(xiàn)程的生命周期,首先看一下下面這張較為經(jīng)典的圖:

新建狀態(tài)(NEW): 當(dāng)線(xiàn)程對(duì)象創(chuàng)建后即進(jìn)入了新建狀態(tài)。 就緒狀態(tài)(Runnable): 當(dāng)調(diào)用線(xiàn)程對(duì)象的Start()方法,線(xiàn)程即進(jìn)入就緒狀態(tài)。處于就緒狀態(tài)的線(xiàn)程只是說(shuō)明此線(xiàn)程已經(jīng)做好了準(zhǔn)備,隨機(jī)等待CPU調(diào)度執(zhí)行,并不是說(shuō)執(zhí)行了Start()此線(xiàn)程立即就會(huì)執(zhí)行。 運(yùn)行狀態(tài)(Running): 當(dāng)CPU開(kāi)始調(diào)度處于就緒狀態(tài)的線(xiàn)程時(shí),此線(xiàn)程才真正執(zhí)行,即進(jìn)入運(yùn)行狀態(tài)。 阻塞狀態(tài)(Blocked): 處于運(yùn)行狀態(tài)中的線(xiàn)程由于某種原因,暫時(shí)放棄對(duì)CPU的使用權(quán),停止執(zhí)行,此時(shí)進(jìn)入阻塞狀態(tài),直到其進(jìn)入到就緒狀態(tài)才有機(jī)會(huì)再次被CPU調(diào)用以進(jìn)入到運(yùn)行狀態(tài)。根據(jù)阻塞產(chǎn)生的原因不同,阻塞狀態(tài)又可以分為三種: 1、等待阻塞:運(yùn)行狀態(tài)中的線(xiàn)程執(zhí)行wait()方法,使本線(xiàn)程進(jìn)入到等待阻塞狀態(tài)。 2、同步阻塞:線(xiàn)程在獲取Synchronized同步鎖失敗(因?yàn)殒i被其它線(xiàn)程鎖占用),它會(huì)進(jìn)入同步阻塞狀態(tài)。 3、其它阻塞:通過(guò)調(diào)用線(xiàn)程的Sleep()或join()或發(fā)出了I/O請(qǐng)求時(shí),線(xiàn)程會(huì)進(jìn)入阻塞狀態(tài)。當(dāng)Sleep()狀態(tài)超時(shí)、join()等待線(xiàn)程終止或者超時(shí)、或者I/O處理完畢時(shí),線(xiàn)程重新轉(zhuǎn)入就緒狀態(tài)。 死亡狀態(tài)(Dead): 線(xiàn)程執(zhí)行完了或者因異常退出了run()方法,該線(xiàn)程結(jié)束生命周期。

線(xiàn)程創(chuàng)建方式

1、繼承Tread類(lèi),重寫(xiě)該類(lèi)的run()方法。 2、實(shí)現(xiàn)Runnable接口,并重寫(xiě)該接口的run()方法。 3、使用Callable和Future接口創(chuàng)建線(xiàn)程,具體是創(chuàng)建Callable接口的實(shí)現(xiàn)類(lèi)并實(shí)現(xiàn)call()方法。并使用FutureTask類(lèi)來(lái)包裝Callable實(shí)現(xiàn)類(lèi)的對(duì)象。

線(xiàn)程同步

同步方法

即有sychronized關(guān)鍵字修飾的方法,由于java的每個(gè)對(duì)象都有一個(gè)內(nèi)置鎖,當(dāng)用此關(guān)鍵字修飾方法時(shí)內(nèi)置鎖會(huì)保護(hù)整個(gè)方法。在調(diào)用該方法前,需要獲得內(nèi)置鎖,否則就處于阻塞狀態(tài)。

同步代碼塊

即有sychronized關(guān)鍵字修飾的語(yǔ)句塊,被該關(guān)鍵字修飾的語(yǔ)句塊會(huì)自動(dòng)被加上內(nèi)置鎖,從而實(shí)現(xiàn)同步。

使用特殊域變量(volatile)實(shí)現(xiàn)線(xiàn)程同步

volatile關(guān)鍵字為域變量的訪問(wèn)提供了一種免鎖機(jī)制,使用volatile修飾域相當(dāng)于告訴虛擬機(jī)該域可能會(huì)被其它線(xiàn)程更新,因此每次使用該域就要重新計(jì)算而不是使用寄存器中的值。volatile不會(huì)提供任何原子操作,它也不會(huì)用來(lái)修飾final類(lèi)型的變量

使用重入鎖實(shí)現(xiàn)線(xiàn)程同步

ReentrantLock類(lèi)是可重入、互斥、實(shí)現(xiàn)了Lock接口的鎖,它與使用synchonized方法和塊具有相同的基本行為和語(yǔ)義,并且擴(kuò)展了其能力。 ReentrantLock():創(chuàng)建一個(gè)ReentrantLock實(shí)例 Lock():獲得鎖 unLock():釋放鎖

使用局部變量實(shí)現(xiàn)線(xiàn)程同步

如果使用ThreadLocal管理變量,則每一個(gè)使用該變量的線(xiàn)程都獲得該變量的副本,副本之間互相獨(dú)立,這樣每一個(gè)線(xiàn)程都可以隨意修改自己的變量副本,而不會(huì)對(duì)其它線(xiàn)程產(chǎn)生影響。 ThreadLocal():創(chuàng)建一個(gè)線(xiàn)程本地變量 get():返回此線(xiàn)程局部變量的當(dāng)前線(xiàn)程副本中的值 initialValue():返回此線(xiàn)程局部變量的當(dāng)前線(xiàn)程的”初始值” set(T value):將此線(xiàn)程局部變量的當(dāng)前線(xiàn)程副本中的值設(shè)置為value

使用阻塞隊(duì)列實(shí)現(xiàn)線(xiàn)程同步

前面5種同步方式都是在底層實(shí)現(xiàn)的線(xiàn)程同步,但是我們?cè)趯?shí)際開(kāi)發(fā)當(dāng)中,應(yīng)當(dāng)盡量遠(yuǎn)離底層結(jié)構(gòu)。使用java.util.concurrent包將有助于簡(jiǎn)化開(kāi)發(fā)。 LinkedBlockingQueue是一個(gè)基于已連接節(jié)點(diǎn)的,范圍任意的blocking queue.隊(duì)列是先進(jìn)先出的順序(FIFO) put(E e):在隊(duì)尾添加一個(gè)元素,如果隊(duì)列滿(mǎn)則阻塞 size():返回隊(duì)列中的元素個(gè)數(shù) take():移除并返回隊(duì)頭元素,如果隊(duì)列空則阻塞

使用原子變量實(shí)現(xiàn)線(xiàn)程同步

需要使用線(xiàn)程同步的根本原因在于對(duì)普通變量的操作不是原子的。 原子操作就是指將讀取變、修改變、保存變量值看成一個(gè)整體來(lái)操作,即這幾種行為要么同時(shí)完成,要么都不完成。 Atomiclnteger表可以用原子方式更新int的值,可用在應(yīng)用程序中(如以原子方式增加的計(jì)數(shù)器),但不能用于替換Integer;可擴(kuò)展Number,允許那些處理機(jī)域數(shù)字類(lèi)的工具和實(shí)用工具進(jìn)行統(tǒng)一訪問(wèn)。 addAddGet(int dalta):以原子方式將給定值與當(dāng)前值相加 get():獲取當(dāng)前值


上一篇:快速排序

下一篇:1028. List Sorting 解析

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 泾阳县| 沙田区| 安福县| 松溪县| 石柱| 平武县| 宁河县| 仁布县| 科尔| 安国市| 浮山县| 秦皇岛市| 德兴市| 临沭县| 开化县| 新巴尔虎右旗| 衡山县| 洪泽县| 马尔康县| 聂荣县| 武夷山市| 武乡县| 竹溪县| 镶黄旗| 麻城市| 湖南省| 金沙县| 宜川县| 盘山县| 宁城县| 呼和浩特市| 和政县| 类乌齐县| 宁安市| 松江区| 蓝田县| 邮箱| 赤峰市| 玉田县| 丽水市| 天津市|