<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在系列文章開始之前,我們首先了解一下執行緒的重要性:
執行緒
(Thread)是“程序”中某個單一順序的控制流。也被稱為輕量程序(lightweightprocesses)。電腦科學術語,指執行中的程式的排程單位。
所有的程式中,都有執行緒
程序是作業系統進行資源分配的最小單位,其中包括:CPU、記憶體空間、磁碟IO 等、同一程序中的多條執行緒共用該程序中的全部系統資源,而程序和程序直接是相互獨立的。程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。
程序是程式在計算機上的一次執行活動。當你執行一個程式,你就啟動了一個程序。顯然程式是死的、靜態的、程序是活動的、動態的。程序可以分為系統程序和使用者程序。凡是用於完成作業系統的各種功能的程序就是系統程序,它們是處於執行狀態下的作業系統本身,使用者程序就是所有由你啟動的程序。
執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比經常更小的、能夠獨立執行的基本單位。執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和堆疊),但是它可以與同一個程序的其他執行緒共用程序所擁有的全部資源。
任何一個程式都必須建立執行緒,特別是Java不管任何程式都必須啟動一個main函數的主執行緒;Java web開發的定時任務、定時器、JSP和Servlet、非同步訊息處理機制,遠端存取介面 RM 等,任何一個監聽事件,onClick的觸發事件等都離不開執行緒和並行的知識。
多核心:也指單晶片多處理器(Chip Multiprocessors,簡稱 CMP),CMP是由美國斯坦福大學提出的,其思想是將大規模並行處理器中的SMP(對稱處理器)整合到同一晶片內,各個處理器並行執行不同的程序。這種依靠多個CPU同時並行的執行程式是實現超高速計算的一個重要方向,稱為並行處理。
多執行緒:Simultaneous Multithreading.簡稱 SMT.讓同一個處理器上的多個執行緒同步執行並共用處理器的執行資源。
核心數、執行緒數:目前主流CPU都是多核的。增加核心數目的就是為了增加執行緒數,因為作業系統是通過執行緒來執行任務的,一般情況下它們是1:1對應關係,也就是說四核 CPU一般擁有四個執行緒。但Intel引入超執行緒技術後,使核心數與執行緒數形成了1:2的關係。
我們平時在開發的時候,感覺並沒有受CPU 核心數的限制,想啟動執行緒就啟動執行緒,哪怕是在單核CPU 上,為什麼?這是因為作業系統提供了一種CPU 時間片輪轉機制。
時間片輪轉排程是一種最古老、最簡單、最公平且使用最廣的一種演演算法,又稱RR 排程。每個程序被分配一個時間段,稱作它的時間片,即該程序執行執行的時間。
我們舉個例子,如果有條高速公路A,上面有4條車道,那麼最大並行車輛就是4輛,這條高速公路同時並排行走的車輛小與等於4的時候,車輛就可以並行行駛。CPU也是這個原理,一個CPU相當於一條高速公路,核心數或執行緒數就相當於並排可以通行的車輛;而多個CPU就相當於有多條高速公路,而每個高速公路並排有多個車道。
當談論並行的時候,一定要加個單位時間,也就是說單位時間內並行量是多少?離開單位時間其實是沒有意義的。
俗話說一心不能二用,這對計算機也一樣,原則上一個CPU只能分配給一個程序,以便執行這個程序。我們通常用的計算機只有一個CPU,也就是說只有一顆心,要讓它一心多用同時執行多個程序,就必須使用並行技術。實現並行技術相當複雜,最容易理解的是“時間片輪轉程序排程演演算法”。
並行:
指應用能夠交替執行不同的任務,比如單CPU核心下執行多執行緒並非是同時執行多個任何,如果你開兩個執行緒執行,就是在你幾乎不可察覺的速度不斷去切換執行這兩個任務,以達到“同時執行”效果,只是計算機的執行速度太快,我們無法察覺到而已。
並行:指應用能夠同時執行不同的任務,例:吃飯的時候可以邊吃飯邊看電視,這兩件事可以同時執行。
**並行和並行兩者的區別就是:一個是交替執行,一個是同時執行**
由於多核CPU的誕生,多執行緒、高並行的程式設計越來越受重視和關注。
從上面CPU的介紹,可以看出現在市面上沒有CPU的核心不使用多執行緒並行機制的,特別是伺服器還不止一個CPU。程式的基本排程單元是執行緒,一個執行緒也只能在一個一個CPU 的一個核的一個執行緒跑,如果你是個i3的CPU的話,最差也是雙核心4執行緒的運算能力:如果是一個執行緒的話,那就會浪費釣3/4的CPU效能:如果設計一個多執行緒的話,那它就可以同時在多個CPU 的多個核的多個執行緒上跑,可以充分的利用CPU,減少CPU的空閒時間,發揮它的運算能力,提高並行量。
比如我們經常使用的下載功能,很多朋友都會開通某一個會員,因為會員版本啟用了多個執行緒去下載,誰都無法忍受一個執行緒去下,為什麼呢?因為多執行緒下載快啊。
我們做程式開發的時候,網頁速度提升1s,如果使用者量大的話,就能增加不少轉換量。我們經常瀏覽的網頁中,瀏覽器在載入頁面的時候,都會去多開幾個執行緒去載入網路資源,提升網站的相應速度。多執行緒和高並行,在計算機中,無處不在。
例如我們做一個電商專案,下訂單和給使用者傳送簡訊、郵件就可以進行拆分,將給使用者傳送簡訊、郵件這兩個步驟獨立成兩個單獨的模組,交給其他執行緒去執行。這樣即增加了非同步的操作,提示了系統效能,又使程式模組化,清晰化和簡單化。
從前面的章節中我們都知道了,在同一個程序裡面的多執行緒是資源共用的,也就是都可以存取同一個記憶體地址當中的一個變數。
例如:若每個執行緒中對全域性變數、靜態變數唯讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則就可能影響執行緒安全。
為了解決執行緒之間的安全性引入了Java 鎖的機制,而一不小心就會產生Java 執行緒死鎖的多執行緒問題,因為不同的執行緒都在等待哪些根本不可能被釋放的鎖,從而導致所有的工作都無法完成。
假設有兩個飢餓的人,他們必須共用刀叉並輪流吃飯,他們都需要獲得兩個鎖,共用刀和共用叉。假如執行緒A獲得了刀,而執行緒B獲得了叉。執行緒A就會進入阻塞狀態來等待獲得叉,而執行緒B則主帥來等待執行緒A所擁有的刀。這只是人為設計的例子,單儘管在執行時很難探測到,這類情況卻時常發生。
執行緒數太多有可能造成系統建立大量執行緒,而導致消耗完系統記憶體以及CPU的“過渡切換”,造成系統的宕機,那麼我們改如果解決這類問題呢?
某些系統資源是有限的,如檔案描述。多執行緒程式可能耗盡資源,因為每個執行緒都可能希望有一個這樣的資源。如果執行緒數相當大,或者某個資源的侯選線 程數遠遠超過了可用的資源數則最好使用資源池。一個最好的範例是資料庫連線池。只要執行緒需要使用一個資料庫連線,它就從池中取出一個,使用以後再將它返回池中。資源池也稱為資源庫。
多執行緒應用開發的注意事項很多,希望大家在日後的工作中可以慢慢體會它 的危險所在。
執行緒之間相互配合,完成某項工作,比如:一個執行緒修改了一個物件的值, 而另一個執行緒感知到了變化,然後進行相應的操作,整個過程開始於一個執行緒, 而最終執行又是另一個執行緒。前者是生產者,後者就是消費者,這種模式隔離了 “做什麼”(what)和“怎麼做”(How),簡單的辦法是讓消費者執行緒不斷地 迴圈檢查變數是否符合預期在 while 迴圈中設定不滿足的條件,如果條件滿足則 退出 while 迴圈,從而完成消費者的工作。
卻存在如下問題:
等待/通知機制:是指一個執行緒 A 呼叫了物件 O 的 wait()方法進入等待狀態,而另一個執行緒 B 呼叫了物件 O 的 notify()或者 notifyAll()方法,執行緒 A 收到通知後從物件 O 的 wait() 方法返回,進而執行後續操作。上述兩個執行緒通過物件 O 來完成互動,而物件 上的 wait()和 notify/notifyAll()的關係就如同開關訊號一樣,用來完成等待方和通 知方之間的互動工作。
notify():通知一個在物件上等待的執行緒,使其從 wait 方法返回,而返回的前提是該執行緒獲取到了物件的鎖,沒有獲得鎖的執行緒重新進入 WAITING 狀態。
notifyAll():通知所有等待在該物件上的執行緒
wait():呼叫該方法的執行緒進入 WAITING 狀態,只有等待另外執行緒的通知或被中斷 才會返回.需要注意,呼叫 wait()方法後,會釋放物件的鎖。
wait(long):超時等待一段時間,這裡的引數時間是毫秒,也就是等待長達n 毫秒,如果沒有 通知就超時返回。
wait (long,int):對於超時時間更細粒度的控制,可以達到納秒
等待和通知的標準正規化 等待方遵循如下原則。
通知方遵循如下原則:
在呼叫 wait()、notify()系列方法之前,執行緒必須要獲得該物件的物件級別鎖,即只能在同步方法或同步塊中呼叫 wait()方法、notify()系列方法,進 入 wait()方法後,當前執行緒釋放鎖,在從 wait()返回前,執行緒與其他執行緒競 爭重新獲得鎖,執行 notify()系列方法的執行緒退出呼叫了 notifyAll 的 synchronized 程式碼塊的時候後,他們就會去競爭。如果其中一個執行緒獲得了該物件鎖,它就會 繼續往下執行,在它退出 synchronized 程式碼塊,釋放鎖後,其他的已經被喚醒的 執行緒將會繼續競爭獲取該鎖,一直進行下去,直到所有被喚醒的執行緒都執行完畢。
notify 和 notifyAll 應該用誰
儘可能用 notifyAll(),謹慎使用 notify(),因為 notify()只會喚醒一個執行緒,我們無法確保被喚醒的這個執行緒一定就是我們需要喚醒的執行緒。
到此這篇關於Java執行緒之間的共用與共同作業詳解的文章就介紹到這了,更多相關Java執行緒共用與共同作業內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45