最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

多線程?怎么用?

2021-04-30 09:42 作者:光耀三十洲  | 我要投稿

Java線程:概念與原理

操作系統(tǒng)中線程和進程的概念

現(xiàn)在的操作系統(tǒng)是多任務(wù)操作系統(tǒng)。多線程是實現(xiàn)多任務(wù)的一種方式。

進程是指一個內(nèi)存中運行的應(yīng)用程序,每個進程都有自己獨立的一塊內(nèi)存空間,一個進程中可以啟動多個線程。比如在Windows系統(tǒng)中,一個運行的exe就是一個進程。

線程是指進程中的一個執(zhí)行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬于某個進程,進程中的多個線程共享進程的內(nèi)存。

學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW

進程是系統(tǒng)進行資源分配和調(diào)度的獨立單位,每一個進程都有它自己的內(nèi)存空間和系統(tǒng)資源。進程實現(xiàn)多處理機環(huán)境下的進程調(diào)度,分派,切換時,都需要花費較大的時間和空間開銷。為了提高系統(tǒng)的執(zhí)行效率,減少處理機的空轉(zhuǎn)時間和調(diào)度切換的時間,以及便于系統(tǒng)管理,所以有了線程,線程取代了進程了調(diào)度的基本功能\

使用多線程最主要的原因是提高系統(tǒng)的資源利用率。現(xiàn)在CPU基本都是多核的,如果你只用單線程,那就是只用到了一個核心,其他的核心就相當(dāng)于空閑在那里了\

在平時工作中多線程是隨時都可見的。比如說,我們系統(tǒng)Web服務(wù)器用的是Tomcat,Tomcat處理每一個請求都會從線程連接池里邊用一個線程去處理。又比如說,我們用連接數(shù)據(jù)庫會用對應(yīng)的連接池,比如Druid/C3P0/DBCP等等,這些都用了多線程的。

學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW

除了上面這些框架已經(jīng)幫我們屏蔽掉「手寫」多線程的問題,在我本身的系統(tǒng)也會用到多線程的。比如說:現(xiàn)在要跑一個定時任務(wù),該任務(wù)的鏈路執(zhí)行時間和過程都非常長,我們這邊就用一個線程池將該定時任務(wù)的請求進行處理,這樣做的好處就是可以及時返回結(jié)果給調(diào)用方,能夠提高系統(tǒng)的吞吐量。

在java中要想實現(xiàn)多線程,有兩種手段,一種是繼續(xù)Thread類,另外一種是實現(xiàn)Runable接口.(其實準(zhǔn)確來講,應(yīng)該有三種,還有一種是實現(xiàn)Callable接口,并與Future、線程池結(jié)合使用,此文這里不講這個。

Java線程的實現(xiàn)形式

這里繼承Thread類的方法是比較常用的一種,如果說你只是想起一條線程。沒有什么其它特殊的要求,那么可以使用Thread.

學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW

繼承Thread類

實現(xiàn)Runnable接口

使用Callable和Future接口創(chuàng)建線程。

main方法其實也是一個線程。在java中所以的線程都是同時啟動的,至于什么時候,哪個先執(zhí)行,完全看誰先得到CPU的資源。

在java中,每次程序運行至少啟動2個線程。一個是main線程,一個是垃圾收集線程。因為每當(dāng)使用java命令執(zhí)行一個類的時候,實際上都會啟動一個JVM,每一個JVM就是在操作系統(tǒng)中啟動了一個進程。

學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW

什么是線程安全

在我的理解下,在Java世界里邊,所謂線程安全就是多個線程去執(zhí)行某類,這個類始終能表現(xiàn)出正確的行為,那么這個類就是線程安全的。比如我有一個count變量,在service方法不斷的累加這個count變量

我個人解決線程安全問題的思路有以下:

  • 能不能保證操作的原子性,考慮atomic包下的類夠不夠我們使用。

  • 能不能保證操作的可見性,考慮volatile關(guān)鍵字夠不夠我們使用

  • 如果涉及到對線程的控制(比如一次能使用多少個線程,當(dāng)前線程觸發(fā)的條件是否依賴其他線程的結(jié)果),考慮CountDownLatch/Semaphore等等。

  • 如果是集合,考慮java.util.concurrent包下的集合類。

  • 如果synchronized無法滿足,考慮lock包下的類

  • ....

總的來說,就是先判斷有沒有線程安全問題,如果存在則根據(jù)具體的情況去判斷使用什么方式去處理線程安全的問題。雖然synchronized很牛逼,但無腦使用synchronized會影響我們程序的性能的。

學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW

死鎖了解嗎?什么情況會造成死鎖?

造成死鎖的原因可以簡單概括為:當(dāng)前線程擁有其他線程需要的資源,當(dāng)前線程等待其他線程已擁有的資源,都不放棄自己擁有的資源。避免死鎖的方式一般有以下方案:

  1. 固定加鎖的順序“,比如我們可以使用Hash值的大小來確定加鎖的先后

  2. 盡可能縮減加鎖的范圍,等到操作共享變量的時候才加鎖。

  3. 使用可釋放的定時鎖(一段時間申請不到鎖的權(quán)限了,直接釋放掉)

學(xué)習(xí)更多,請點擊:https://www.bilibili.com/video/BV1aV411Y766

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV135411w7Jg

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7fm

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1sf4y1p7mF

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1GZ4y1F7qW


作者:狼王編程
鏈接:https://juejin.cn/post/6956489992340242446
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。


多線程?怎么用?的評論 (共 條)

分享到微博請遵守國家法律
镇安县| 井冈山市| 射阳县| 页游| 抚顺市| 顺义区| 岚皋县| 潞西市| 连平县| 皮山县| 老河口市| 哈尔滨市| 长白| 江陵县| 昌吉市| 新龙县| 兴隆县| 辉南县| 水城县| 彭水| 剑川县| 盐亭县| 乐安县| 余江县| 项城市| 依安县| 东乌珠穆沁旗| 循化| 霍林郭勒市| 文昌市| 扎兰屯市| 揭东县| 手游| 渑池县| 札达县| 南漳县| 察哈| 淅川县| 婺源县| 溧阳市| 桓仁|