2020-09-23
Java培訓
好程序員Java培訓告訴你Java-線程怎么來的?并發(fā)處理的廣泛應用是使得amdahl定律代替摩爾定律成為計算機性能發(fā)展源動力的根本原因,是人類壓榨計算機運算能力的最有力武器。
并發(fā)并非一定得用多線程,多進程也可以,不過java里面談論并發(fā),大多數(shù)與線程脫不開關系。因此我們從線程說起。好程序員小編主要在本文介紹了以下內容:
線程的實現(xiàn) 線程的調度 線程狀態(tài)切換
線程的實現(xiàn)
線程是比進程更輕量級的調度執(zhí)行單位,在linux里面,線程和進程沒有什么區(qū)別,唯一的就是在地址空間,線程的切換虛擬內存空間依然是相同的,但是進程切換是不同的。
目前主流的操作系統(tǒng)都提供的線程實現(xiàn),java則提供的線程實現(xiàn)方法都是native的,因為不同的硬件和操作系統(tǒng)提供線程調度方式并不盡相同,所以java沒用采用和平臺無關的統(tǒng)一手段來實現(xiàn)。
實現(xiàn)線程的主要3種方式:使用內核線程實現(xiàn),使用用戶線程實現(xiàn),使用用戶線程加輕量級進程混合實現(xiàn)。
內核線程實現(xiàn)
內核線程(KLT)就是直接由操作系統(tǒng)內核支持的線程,這種線程由內核來完成線程切換。
程序一般不會直接使用內核線程,而是去使用內核線程的一種高級接口—輕量級進程(LWP),輕量級進程就是我們所講的線程,這種輕量級進程與內核線程之間1:1的對應關系。
優(yōu)點:
內核直接支持,由操作系統(tǒng)內核創(chuàng)建和撤銷。內核維護進程及線程的上下文信息以及線程切換。一個內核線程由于I/O操作而阻塞,不會影響其它線程的運行。
缺點:
1、線程的操作、創(chuàng)建、同步等都需要系統(tǒng)調用,而系統(tǒng)調用代價比較高,需要在用戶態(tài)和內核態(tài)中來回切換。
2、每個輕量級的進程都需要一個內核線程來支持,需要消耗一定的內核資源。
用戶線程實現(xiàn)
用戶線程指不需要內核支持而在用戶程序中實現(xiàn)的線程,其不依賴于操作系統(tǒng)核心,應用進程利用線程庫提供創(chuàng)建、同步、調度和管理線程的函數(shù)來控制用戶線程。
不需要用戶態(tài)/核心態(tài)切換,速度快,操作系統(tǒng)內核不知道多線程的存在,因此一個線程阻塞將使得整個進程(包括它的所有線程)阻塞。使用用戶線程實現(xiàn)的程序一般都比較復雜,java曾經(jīng)用過,不過最后還是放棄了。
優(yōu)點:
切換由用戶態(tài)程序自己控制內核切換,不需要內核干涉,少了進出內核態(tài)的消耗。
缺點:
多核處理器很難講線程映射到其他處理器上,單線程阻塞會造成該進程阻塞。
用戶線程加輕量級進程混合實現(xiàn)
這種混合模式下,既存在用戶線程,也存在輕量級進程。用戶線程還是完全建立在用戶空間中,因此用戶線程的創(chuàng)建、切換、析構等依然廉價,可以支持大規(guī)模的用戶線程并發(fā)。
操作系統(tǒng)提供支持的輕量進程作為用戶線程和內核線程之間的橋梁,用戶線程的系統(tǒng)調用要通過輕量級線程來完成,大大降低了進程阻塞的風險。用戶線程和輕量級進程比是N:M多對對的關系。
java在jdk 1.2之前基于用戶線程實現(xiàn),在1.2之后,基于操作系統(tǒng)的原生線程模型來實現(xiàn),在每個平臺上都不盡相同,比如在windows和linux下都是采用一對一的線程模型實現(xiàn),在Solaris平臺,采用都是一對一或者多對多來實現(xiàn)(solaris 同時支持一對一和多對多)。
線程調度
線程調度主要是指系統(tǒng)為線程分配處理器使用權的過程,主要分為:協(xié)同式線程調度和搶占式線程調度。
協(xié)同式調度
協(xié)同式調度中線程的執(zhí)行時間由線程本身來控制,線程把自己的工作執(zhí)行完成以后,主動通知系統(tǒng)切換到另一個線程上。像lua的“協(xié)同歷程”就是如此實現(xiàn)的。
優(yōu)點:
實現(xiàn)簡單,線程把自己的事情干完后進行線程切換,切換操作對線程自己是可知的。無同步問題
缺點:
線程執(zhí)行時間不可控制,如果某個線程出現(xiàn)問題阻塞,會造成程序阻塞。
搶占式線程調度
搶占式線程調度中每個線程由系統(tǒng)來分配執(zhí)行時間,線程的切換不由線程本身來決定。
優(yōu)點:
線程的執(zhí)行時間系統(tǒng)可控,不會出現(xiàn)單個線程阻塞造成整個進程阻塞。
java就是采用搶占式線程調度,另外,java還可以通過給線程設置優(yōu)先級來建議系統(tǒng)給某些線程多分配一點時間,不過不是很靠譜,線程的調度最終還是取決的操作系統(tǒng)。
狀態(tài)轉換
java定義了5中線程狀態(tài),任意一個時間點,一個線程有且只有其中一個狀態(tài)。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號-5 京公網(wǎng)安備 11010802035720號