日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

JUC

發布時間:2025/3/15 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JUC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是JUC

在Java 5.0 提供了java.util.concurrent(簡稱JUC )包,在此包中增加了在并發編程中很常用的實用工具類,用于定義類似于線程的自定義子系統,包括線程池、異步IO 和輕量級任務框架。提供可調的、靈活的線程池。還提供了設計用于多線程上下文中Collection 實現等。

二、進程和線程

1.進程與線程(QQ音樂(這是一個進程)與評論+播放歌曲(這是兩個線程))

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

  • wait狀態和block狀態的區別

WAITING狀態

當前線程調用object.wait方法后,釋放對象鎖,這個狀態就是WAITING狀態,線程處于等待隊列,等待其他線程同一個對象調用notify或者notifyAll方法。

BLOCKED狀態
在調用notify或者notifyAll方法后,調用wait的等待線程不會立刻從等待隊列返回,而是從等待隊列移動到同步隊列,準備競爭對象監視器的這種狀態就是BLOCKED,換句話說就是如果同時有不止一個線程競爭對象監視器,那么這種狀態就是對象監視器。

也就是說只有synchronized會導致線程進入Blocked狀態,Waiting狀態只能進入Blocked狀態,獲取鎖之后才能恢復執行。

3.等待隊列

調用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) 代碼段內。

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

    三、并行和并發

    并發:同一時刻多個線程在訪問同一個資源,多個線程對一個點(搶票)
    并行:多項工作一起執行,之后再匯總(例子:泡方便面,電水壺燒水)
    本文轉載

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的JUC的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。