java線程實現及線程池的使用

Java線程實現

線程把處理器的調度和資源分配分開,是cpu的最小調度單位。多個線程可以共享進程的內存資源,又可以獨立調度。java線程關鍵方法都是通過高效的本地方法實現的。Java線程的主要實現方式有三種:內核實現、用戶實現、內核用戶混合實現。

1.內核實現

內核線程就是由內核調度、映射的線程。支持多線程的內核稱為多線程內核。這種線程,所有操作都需要系統調度,需要在內核態和用戶態切換,系統調用代價比較高。

2.用戶實現

這種線程建立在用戶空間,在用戶態中建立、同步、銷毀,不需要內核操作。這種操作非常快速且消耗低,可以支持更多的線程。但是線程阻塞和處理器的分配等功能在不借助內核態的情況下實現起來非常難,所以很少單獨使用。

3.內核用戶混合實現

最后是上面兩種方式的結合,通過用戶線程實現線程的創建、切換、析構等,而通過內核提供的輕量級進程實現線程的調度及處理器的映射。

JDK采用的是第二種方式即內核實現,每一個java線程都會對應內核提供的一條輕量級進程。

Java線程調度

線程調度就是分配處理器使用權的過程,主流的調度方式有兩種:協同式線程調度和搶占式線程調度。
協同式線程調度中線程的執行時間由線程自身控制,線程執行完后,要主動通知系統切換線程。這種方式實現起來比較簡單,且不存在線程同步問題。但是由于線程自身控制切換操作,若某個線程出現問題,可能會導致系統的崩潰。
搶占式線程調度中線程的調度由系統控制,這樣就可以避免某個線程掛掉而導致整個系統崩潰。我們的jdk線程就是采用的這種調度方式,系統運行起來會更加的穩定。
當然我們可以通過設置線程的優先級來提高某些線程的執行幾率,但是這種方式存在很大的不確定性。因為線程優先級的實現依賴于具體的操作系統平臺,不同的平臺優先級實現不同,可能會導致java中不同線程優先級在一些平臺上卻是按相同優先級進行調度的,另外操作系統還可能根據某些策略來忽略線程優先級,所以線程在cpu中的具體調度策略和執行順序是不可知的,我們不能想當然的臆測線程的執行邏輯。

java線程生命周期

Java線程主要存在5中狀態:新建(new)、運行(runnable)、無限期等待(waitting)、有限期等待(timed waiting)、阻塞(blocked)、結束(terminated)。
1.新建:創建后尚未啟動的線程。
2.運行:正在執行及等待cpu時間片的線程。
3.無限期等待:不會被分配時間片,等待喚醒的線程。主要包括:使用了Object.wait()、Thread.join()、LockSupport.park()等無timeout參數方法的線程。
4.有期限等待:這種狀態的線程也不會被分配時間片,但是在一定時間后系統會自動喚醒它們。主要包括:使用了Thread.sleep()及上面3中幾個帶timeout參數方法的線程。
5.結束:已經終止的線程。

線程池的優點

由于java線程是通過內核中的輕量級進程實現的,線程創建和銷毀都需要切換到內核態,線程生命周期開銷非常高。同時新建線程也會導致請求延遲一會才能被處理。另外由于每個線程都會分配一些獨立的內存空間,若創建過多的線程會增加內存的占用,同時大量空閑的線程持有對象強引用,會給垃圾回收帶來很大的壓力,大量的線程競爭cpu資源也會產生很大的性能開銷,降低程序的執行速度。在后端服務中經常會出現某些rpc接口的延遲抖動會導致整個服務所有接口性能下降,主要就是因為:依賴的外部接口抖動延遲響應時間變長,請求接口的線程阻塞同時大量請求重試,這時大量新線程被創建,cpu頻繁進行用戶態內核切換及大量線程爭用cpu,導致服務性能逐步下降。線程池的出現非常好的解決了上面的問題,現在代碼中已經很少能見到直接new Thread的操作了,有這種操作的程序猿要么是掃地圣僧,要么就是刪庫跑路的狠人了,哈哈哈哈。

線程及線程池使用注意點

1.盡量避免使用守護線程

Jvm在正常關閉時,會先并行執行關閉鉤子及所有已提交和執行中的普通線程,然后去處理定義了finalize方法的對象,做好這些后就會直接結束運行,不會管是否有是正在執行的守護線程,若我們在自定義的守護線程中進行了業務操作或IO操作之類的,就可能造成意外的業務錯誤。

2.避免改變線程優先級

jvm中的線程優先級只能作為線程調度的參考,線程并不一定按優先級高低順序執行,這是因為jvm中線程優先級是通過映射系統調度優先級實現的,依賴于特定的平臺,而不同平臺實現的調度優先級不同,因此兩個不同優先級的線程可能被映射成相同的調度優先級。除此之外使用優先級還可能會導致某些線程一直無法獲取cpu的調度,進而導致線程的饑餓問題。

3.依賴性任務可能導致線程的饑餓死鎖

在線程池中,如果任務依賴于其他任務,并且依賴的任務也在同一線程池中執行,那么便可能產生死鎖。當依賴的任務被拒絕或者一直停留在工作隊列中,那么任務就會一直阻塞并一直占用線程,隊列中任務也獲取不到這個線程,就會產生死鎖,這種死鎖被稱為線程饑餓死鎖。

4.線程池中的任務應該是同類型的獨立任務

計算密集型任務一定不能和IO密集型共用同一個線程池。道理其實很簡單,我們舉個例子:我們有兩個線程并行執行,其中一個需要9毫秒,而另一個需要1毫秒,當我們采用串行執行時任務執行所需時間為10毫秒,而當我并行執行時任務執行所需時間為9毫秒,線程的切換可能還需要一些時間(假設2毫秒),這樣算下來拋除線程切換造成的cpu資源浪費,結果并行時間反而還沒有串行快,吃力不討好啊。實際上計算密集型和IO密集型任務不但應該使用不同的線程池,連線程池大小的配置策略也是大不相同,小伙伴們要注意下。由此我們可以進一步推出:執行時間較長的任務不能和執行時較短的任務共用一個線程池,執行時間較長的任務不僅可能造成線程阻塞,也會增加執行時間較短任務的響應時間,甚至當長時間任務的qps大于線程池中的線程數量時,可能會出現所有線程都在執行長時間任務的現象,嚴重影響服務的性能。總而言之,線程池中的任務應該是同類型的獨立任務,并且我們需要根據任務類型去合理配置線程池的線程數量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450971.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450971.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SOAP:簡單對象訪問協議

見:https://baike.baidu.com/item/%E7%AE%80%E5%8D%95%E5%AF%B9%E8%B1%A1%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE/3841505?fraladdin&fromid4684413&fromtitleSOAP 簡單對象訪問協議 SOAP(簡單對象訪問協議)一般指簡單對象訪問協議 …

程序調試

對拍 $ Windows $ 下的對拍程序 借助 \(Windows\) 腳本echo off :loop r.exe > input.in coronas.exe <input.in > output.a std.exe <input.in > output.b fc output.a output.b if not errorlevel 1 goto loop 一直沒有找到怎樣能控制對拍次數,今天終于醒悟,可…

不怕燒錢怕翻車:雷軍與馬化騰現場“過招”

說起微信&#xff0c;很多時尚潮人都很熟悉。這款軟件可以發送語音信息、可以在有無線網絡的地方免費發送、甚至只需搖一搖就能找到在你附近的用戶&#xff0c;這些方便、時尚、新穎的元素使微信受到了很多用戶的喜愛&#xff0c;也奪得了大量的市場。其實&#xff0c;在微信發…

php基礎(一)

1、header(contentType:text/html,charset:utf-8)設置編碼 2、查找字符串最后一次出現的 strrpos() 查找字符第一次出現的 strpos 3、array_sum() 返回數組值得和 4、func_num_args() 求函數參數的個數 5、func_get_args() 獲取函數的所有參數 6、匿名函數 例子 $anonymityfun…

Thread.yield()和Thread.sleep(0)

關于Thread.yield()和Thread.sleep(0)的語義問題真是一個讓人撓頭的問題&#xff0c;翻了好多資料&#xff0c;在java6語言規范中看到了一段這樣的描述&#xff1a; 重點在紅框中&#xff0c;簡而言之就是&#xff1a;sleep(0)和yield()的實現不需要任何可見的效果。那么在實現…

OOA:面向對象

見&#xff1a;https://baike.baidu.com/item/OOA/3659916?fraladdin OOA:面向對象&#xff1a; Object-Oriented Analysis&#xff08;面向對象分析方法&#xff09;是確定需求或者業務的角度&#xff0c;按照面向對象的思想來分析業務。例如&#xff1a;OOA只是對需求中描述…

DCT原型 ——傅里葉級數

傅里葉級數 法國數學家傅里葉發現&#xff0c;任何周期函數都可以用正弦函數和余弦函數構成的無窮級數來表示&#xff08;選擇正弦函數與余弦函數作為基函數是因為它們是正交的&#xff09;&#xff0c;后世稱為傅里葉級數&#xff08;法語&#xff1a;srie de Fourier&#xf…

c 遞歸算法

#include <stdio.h>double factorial(unsigned int i) {if(i < 1){return 1;}return i * factorial(i - 1); } int main() {int i 15;printf("%d 的階乘為 %f\n", i, factorial(i));return 0; } 轉載于:https://www.cnblogs.com/sea-stream/p/9822437.htm…

紅黑樹和B+樹

&#xff08;一&#xff09;紅黑樹 紅黑樹是一種自平衡二叉查找樹&#xff0c;也被稱為"對稱二叉B樹"&#xff0c;它可以在O(logn)時間內利用 O(logn)的空間來完成查找、插入、刪除操作。紅黑樹的讀操作與普通二叉查找樹相同&#xff0c;而插入和刪除操作可能會破壞…

策略模式、觀察者模式、代理模式、裝飾模式 應用場景和實現

有個大神寫的很好&#xff1a; 參考&#xff1a;設計模式學習筆記&#xff08;四&#xff1a;策略模式&#xff09; 參考&#xff1a;設計模式學習筆記&#xff08;二&#xff1a;觀察者模式&#xff09; 參考&#xff1a;設計模式學習筆記-代理模式 參考&#xff1a;設計模式-…

DQL、DML、DDL、DCL的概念與區別

http://blog.csdn.net/tomatofly/article/details/5949070 SQL語言的分類 SQL語言共分為四大類&#xff1a;數據查詢語言DQL&#xff08;Data Query Language&#xff09;&#xff0c;數據操縱語言DML&#xff0c;數據定義語言DDL(Data Definition Language)&#xff0c;數據…

python學習總結

1.python環境搭建方便&#xff0c;只需要安裝python解釋器 2.python把任意數據類型賦值給變量&#xff0c;不用定義類型 3.Python的整數浮點數沒有大小限制&#xff0c;不用擔心超過數值范圍。比如java的 int&#xff0c;long 4.python自帶最常用的list列表和dicitonary字典&am…

李國杰院士:國內開源社區的崛起需要一個過程

[CSDN.NET 付江/文]日前&#xff0c;在第二屆“龍芯杯”中國開源軟件設計大賽啟動儀式上&#xff0c;CSDN記者專訪了中國工程院院士、第三世界科學院院士李國杰。李國杰院士就國產基礎軟件現狀、面臨的機遇和挑戰、開源環境以及生態系統建設等話題分享了自己的看法。 打造自主…

SuperMap iObject入門開發系列之五管線屬性查詢

本文是一位好友“托馬斯”授權給我來發表的&#xff0c;介紹都是他的研究成果&#xff0c;在此&#xff0c;非常感謝。 管線屬性查詢功能針對單一管線圖層進行特定的條件查詢&#xff0c;然后將查詢結果輸出為列表&#xff0c;并添加點位閃爍功能&#xff0c;例如查詢污水管線中…

三類基于貪心思想的區間覆蓋問題

一、區間完全覆蓋問題 問題描述&#xff1a;給定一個長度為m的區間&#xff0c;再給出n條線段的起點和終點&#xff08;注意這里是閉區間&#xff09;&#xff0c;求最少使用多少條線段可以將整個區間完全覆蓋。 樣例&#xff1a;一個長度為8的區間&#xff0c;可選的線段有[2,…

ubuntu 常用軟件和命令

永久修改屏幕的分辨率   sudo gedit .profile 將下面的四句話加入。.profile文件的最后   cvt 1280 768   xrandr --newmode "1280x768_60.00" 79.50 1280 1344 1472 1664 768 771 781 798 -hsync vsync   xrandr --addmode Virtual1 "1280x768_60.00&q…

Eclipse搭建Android開發環境(安裝ADT,Android4.4.2)

見&#xff1a;http://blog.csdn.net/zht666/article/details/29837777 使用Eclipse做Android開發&#xff0c;需要先在Eclipse上安裝ADT&#xff08;Android Development Tools&#xff09;插件。 1.安裝JDK 1.7 JDK官網http://www.oracle.com/technetwork/java/javase/downlo…

C語言 位操作簡析

位運算 前面介紹的各種運算都是以字節作為最基本位進行的。 但在很多系統程序中常要求在位(bit)一級進行運算或處理。&#xff23;語言提供了位運算的功能&#xff0c; 這使得&#xff23;語言也能像匯編語言一樣用來編寫系統程序。 一、位運算符&#xff23;語言提供了六種位運…

算法:輸入一個鏈表,輸出該鏈表中倒數第k個結點。

算法&#xff1a;輸入一個鏈表&#xff0c;輸出該鏈表中倒數第k個結點。《劍指offer》 思路加到注釋里面了&#xff1b; 1&#xff1a;兩個if判斷是否返回值為空&#xff0c;首個為空&#xff0c;沒有第k個值&#xff1b; 2&#xff1a;for循環找到倒數第k個值&#xff0c;返回…

Spring事務那些事兒

&#xff08;一&#xff09;事務的隔離級別 大家都知道事務有四個屬性&#xff0c;即ACID&#xff08;原子性、一致性、隔離性、持久性&#xff09;。這四個里面稍微難理解點的是一致性和持久性。所謂的一致性是指&#xff1a;事務執行前后數據的一致性狀態&#xff0c;例如事…