日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

JUC

發(fā)布時(shí)間:2025/3/15 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JUC 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、什么是JUC

在Java 5.0 提供了java.util.concurrent(簡(jiǎn)稱JUC )包,在此包中增加了在并發(fā)編程中很常用的實(shí)用工具類,用于定義類似于線程的自定義子系統(tǒng),包括線程池、異步IO 和輕量級(jí)任務(wù)框架。提供可調(diào)的、靈活的線程池。還提供了設(shè)計(jì)用于多線程上下文中Collection 實(shí)現(xiàn)等。

二、進(jìn)程和線程

1.進(jìn)程與線程(QQ音樂(lè)(這是一個(gè)進(jìn)程)與評(píng)論+播放歌曲(這是兩個(gè)線程))

  • 進(jìn)程:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進(jìn)程既是基本的分配單元,也是基本的執(zhí)行單元。
  • 線程:通常在一個(gè)進(jìn)程中可以包含若干個(gè)線程,當(dāng)然一個(gè)進(jìn)程中至少有一個(gè)線程,不然沒(méi)有存在的意義。線程可以利用進(jìn)程所擁有的資源,在引入線程的操作系統(tǒng)中,通常都是把進(jìn)程作為分配資源的基本單位,而把線程作為獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位,由于線程比進(jìn)程更小,基本上不擁有系統(tǒng)資源,故對(duì)它的調(diào)度所付出的開(kāi)銷就會(huì)小得多,能更高效的提高系統(tǒng)多個(gè)程序間并發(fā)執(zhí)行的程度。
    2.線程的狀態(tài)
public enum State {NEW,(新建)//實(shí)現(xiàn)Runnable接口和繼承Thread可以得到一個(gè)線程類,new一個(gè)實(shí)例出來(lái),線程就進(jìn)入了初始狀態(tài)。RUNNABLE,(準(zhǔn)備就緒)//細(xì)分Running和Ready//就緒狀態(tài)(ready)//1.就緒狀態(tài)只是有資格運(yùn)行,調(diào)度程序沒(méi)有挑選到你,就永遠(yuǎn)是就緒狀態(tài)。//2.調(diào)用線程的start()方法,此線程進(jìn)入就緒狀態(tài)。//3.當(dāng)前線程sleep()方法結(jié)束,其他線程join()結(jié)束,等待用戶輸入完畢,某個(gè)線程拿到對(duì)象 鎖,這些線程也將進(jìn)入就緒狀態(tài)。//4.當(dāng)前線程時(shí)間片用完了,調(diào)用當(dāng)前線程的yield()方法,當(dāng)前線程進(jìn)入就緒狀態(tài)。//5.鎖池里的線程拿到對(duì)象鎖后,進(jìn)入就緒狀態(tài)。//運(yùn)行中狀態(tài)//線程調(diào)度程序從可運(yùn)行池中選擇一個(gè)線程作為當(dāng)前線程時(shí)線程所處的狀態(tài)。這也是線程進(jìn)入運(yùn)行狀態(tài)的唯一一種方式。BLOCKED,(阻塞)//阻塞狀態(tài)是線程阻塞在進(jìn)入synchronized關(guān)鍵字修飾的方法或代碼塊(獲取鎖)時(shí)的狀態(tài)。WAITING,(不見(jiàn)不散)//該狀態(tài)的線程不會(huì)被分配CPU執(zhí)行時(shí)間,它們要等待被顯式地喚醒,否則會(huì)處于無(wú)限期等待的狀態(tài)。TIMED_WAITING,(過(guò)時(shí)不候)//處于這種狀態(tài)的線程不會(huì)被分配CPU執(zhí)行時(shí)間,不過(guò)無(wú)須無(wú)限期等待被其他線程顯示地喚醒,在達(dá)到一定時(shí)間后它們會(huì)自動(dòng)喚醒。TERMINATED;(終結(jié))//當(dāng)線程的run()方法完成時(shí),或者主線程的main()方法完成時(shí),我們就認(rèn)為它終止了。這個(gè)線程對(duì)象也許是活的,但是,它已經(jīng)不是一個(gè)單獨(dú)執(zhí)行的線程。線程一旦終止了,就不能復(fù)生。 //在一個(gè)終止的線程上調(diào)用start()方法,會(huì)拋出java.lang.IllegalThreadStateException異常。 }

  • wait狀態(tài)和block狀態(tài)的區(qū)別

WAITING狀態(tài)

當(dāng)前線程調(diào)用object.wait方法后,釋放對(duì)象鎖,這個(gè)狀態(tài)就是WAITING狀態(tài),線程處于等待隊(duì)列,等待其他線程同一個(gè)對(duì)象調(diào)用notify或者notifyAll方法。

BLOCKED狀態(tài)
在調(diào)用notify或者notifyAll方法后,調(diào)用wait的等待線程不會(huì)立刻從等待隊(duì)列返回,而是從等待隊(duì)列移動(dòng)到同步隊(duì)列,準(zhǔn)備競(jìng)爭(zhēng)對(duì)象監(jiān)視器的這種狀態(tài)就是BLOCKED,換句話說(shuō)就是如果同時(shí)有不止一個(gè)線程競(jìng)爭(zhēng)對(duì)象監(jiān)視器,那么這種狀態(tài)就是對(duì)象監(jiān)視器。

也就是說(shuō)只有synchronized會(huì)導(dǎo)致線程進(jìn)入Blocked狀態(tài),Waiting狀態(tài)只能進(jìn)入Blocked狀態(tài),獲取鎖之后才能恢復(fù)執(zhí)行。

3.等待隊(duì)列

調(diào)用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫(xiě)在synchronized(obj) 代碼段內(nèi)。

1.線程1獲取對(duì)象A的鎖,正在使用對(duì)象A。 2.線程1調(diào)用對(duì)象A的wait()方法。 3.線程1釋放對(duì)象A的鎖,并馬上進(jìn)入等待隊(duì)列。 4.鎖池里面的對(duì)象爭(zhēng)搶對(duì)象A的鎖。 5.線程5獲得對(duì)象A的鎖,進(jìn)入synchronized塊,使用對(duì)象A。 6.線程5調(diào)用對(duì)象A的notifyAll()方法,喚醒所有線程,所有線程進(jìn)入同步隊(duì)列。若線程5調(diào)用對(duì)象A的notify()方法, 則喚醒一個(gè)線程,不知道會(huì)喚醒誰(shuí),被喚醒的那個(gè)線程進(jìn)入同步隊(duì)列。 7.notifyAll()方法所在synchronized結(jié)束,線程5釋放對(duì)象A的鎖。 8.同步隊(duì)列的線程爭(zhēng)搶對(duì)象鎖,但線程1什么時(shí)候能搶到就不知道了。
  • 方法比較
  • 1.Thread.sleep(long millis),一定是當(dāng)前線程調(diào)用此方法,當(dāng)前線程進(jìn)入TIMED_WAITING狀態(tài),但不釋放對(duì)象鎖,millis后線程自動(dòng)蘇醒進(jìn)入就緒狀態(tài)。作用:給其它線程執(zhí)行機(jī)會(huì)的最佳方式。 2.Thread.yield(),一定是當(dāng)前線程調(diào)用此方法,當(dāng)前線程放棄獲取的CPU時(shí)間片,但不釋放鎖資源,由運(yùn)行狀態(tài)變?yōu)榫途w狀態(tài),讓OS再次選擇線程。作用:讓相同優(yōu)先級(jí)的線程輪流執(zhí)行,但并不保證一定會(huì)輪流執(zhí)行。實(shí)際中無(wú)法保證yield()達(dá)到讓步目的,因?yàn)樽尣降木€程還有可能被線程調(diào)度程序再次選中。Thread.yield()不會(huì)導(dǎo)致阻塞。該方法與sleep()類似,只是不能由用戶指定暫停多長(zhǎng)時(shí)間。 3.thread.join()/thread.join(long millis),當(dāng)前線程里調(diào)用其它線程t的join方法,當(dāng)前線程進(jìn)入WAITING/TIMED_WAITING狀態(tài),當(dāng)前線程不會(huì)釋放已經(jīng)持有的對(duì)象鎖。線程t執(zhí)行完畢或者millis時(shí)間到,當(dāng)前線程一般情況下進(jìn)入RUNNABLE狀態(tài),也有可能進(jìn)入BLOCKED狀態(tài)(因?yàn)閖oin是基于wait實(shí)現(xiàn)的)。 4.obj.wait(),當(dāng)前線程調(diào)用對(duì)象的wait()方法,當(dāng)前線程釋放對(duì)象鎖,進(jìn)入等待隊(duì)列。依靠notify()/notifyAll()喚醒或者wait(long timeout) timeout時(shí)間到自動(dòng)喚醒。 5.obj.notify()喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程,選擇是任意性的。notifyAll()喚醒在此對(duì)象監(jiān)視器上等待的所有線程。 6.LockSupport.park()/LockSupport.parkNanos(long nanos),LockSupport.parkUntil(long deadlines), 當(dāng)前線程進(jìn)入WAITING/TIMED_WAITING狀態(tài)。對(duì)比wait方法,不需要獲得鎖就可以讓線程進(jìn)入WAITING/TIMED_WAITING狀態(tài),需要通過(guò)LockSupport.unpark(Thread thread)喚醒。

    三、并行和并發(fā)

    并發(fā):同一時(shí)刻多個(gè)線程在訪問(wèn)同一個(gè)資源,多個(gè)線程對(duì)一個(gè)點(diǎn)(搶票)
    并行:多項(xiàng)工作一起執(zhí)行,之后再匯總(例子:泡方便面,電水壺?zé)?#xff09;
    本文轉(zhuǎn)載

    與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的JUC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。