日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

聊聊Java中是什么方法導(dǎo)致的線程阻塞

瀏覽:215日期:2022-08-16 15:17:18
一、為什么引入線程阻塞機(jī)制?

為了解決對(duì)共享存儲(chǔ)區(qū)的訪問沖突,Java 引入了同步機(jī)制,現(xiàn)在讓我們來考察多個(gè)線程對(duì)共享資源的訪問,顯然同步機(jī)制已經(jīng)不夠了,因?yàn)樵谌我鈺r(shí)刻所要求的資源不一定已經(jīng)準(zhǔn)備好了被訪問,反過來,同一時(shí)刻準(zhǔn)備好了的資源也可能不止一個(gè)。為了解決這種情況下的訪問控制問題,Java 引入了對(duì)阻塞機(jī)制的支持

阻塞指的是暫停一個(gè)線程的執(zhí)行以等待某個(gè)條件發(fā)生(如某資源就緒),學(xué)過操作系統(tǒng)的同學(xué)對(duì)它一定已經(jīng)很熟悉了。Java 提供了大量方法來支持阻塞,下面讓我們逐一分析。

二、Java中實(shí)現(xiàn)線程阻塞的方法:

(1)線程睡眠:Thread.sleep (long millis)方法,使線程轉(zhuǎn)到阻塞狀態(tài)。millis參數(shù)設(shè)定睡眠的時(shí)間,以毫秒為單位。當(dāng)睡眠結(jié)束后,就轉(zhuǎn)為就緒(Runnable)狀態(tài)。sleep()平臺(tái)移植性好。

(2)線程等待:Object類中的wait()方法,導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 喚醒方法。這個(gè)兩個(gè)喚醒方法也是Object類中的方法,行為等價(jià)于調(diào)用 wait() 一樣。wait() 和 notify() 方法:兩個(gè)方法配套使用,wait() 使得線程進(jìn)入阻塞狀態(tài),它有兩種形式,一種允許 指定以毫秒為單位的一段時(shí)間作為參數(shù),另一種沒有參數(shù),前者當(dāng)對(duì)應(yīng)的 notify() 被調(diào)用或者超出指定時(shí)間時(shí)線程重新進(jìn)入可執(zhí)行狀態(tài),后者則必須對(duì)應(yīng)的 notify() 被調(diào)用.

(3)線程禮讓,Thread.yield() 方法,暫停當(dāng)前正在執(zhí)行的線程對(duì)象,把執(zhí)行機(jī)會(huì)讓給相同或者更高優(yōu)先級(jí)的線程。yield() 使得線程放棄當(dāng)前分得的 CPU 時(shí)間,但是不使線程阻塞,即線程仍處于可執(zhí)行狀態(tài),隨時(shí)可能再次分得 CPU 時(shí)間。調(diào)用 yield() 的效果等價(jià)于調(diào)度程序認(rèn)為該線程已執(zhí)行了足夠的時(shí)間從而轉(zhuǎn)到另一個(gè)線程.

(4)線程自閉,join()方法,等待其他線程終止。在當(dāng)前線程中調(diào)用另一個(gè)線程的join()方法,則當(dāng)前線程轉(zhuǎn)入阻塞狀態(tài),直到另一個(gè)進(jìn)程運(yùn)行結(jié)束,當(dāng)前線程再由阻塞轉(zhuǎn)為就緒狀態(tài)。

(5)suspend() 和 resume() 方法:兩個(gè)方法配套使用,suspend()使得線程進(jìn)入阻塞狀態(tài),并且不會(huì)自動(dòng)恢復(fù),必須其對(duì)應(yīng)的resume() 被調(diào)用,才能使得線程重新進(jìn)入可執(zhí)行狀態(tài)。典型地,suspend() 和 resume() 被用在等待另一個(gè)線程產(chǎn)生的結(jié)果的情形:測(cè)試發(fā)現(xiàn)結(jié)果還沒有產(chǎn)生后,讓線程阻塞,另一個(gè)線程產(chǎn)生了結(jié)果后,調(diào)用 resume() 使其恢復(fù)。Thread中suspend()和resume()兩個(gè)方法在JDK1.5中已經(jīng)廢除,不再介紹。因?yàn)橛兴梨i傾向。

這里,筆者放入一張線程生命周期的經(jīng)典圖片,來幫助讀者理解,里面展示了一個(gè)線程從創(chuàng)建->運(yùn)行->阻塞->運(yùn)行->死亡的全過程:

聊聊Java中是什么方法導(dǎo)致的線程阻塞

三、常用線程名詞解釋

主線程:JVM調(diào)用程序main()所產(chǎn)生的線程。

當(dāng)前線程:這個(gè)是容易混淆的概念。一般指通過Thread.currentThread()來獲取的進(jìn)程。

后臺(tái)線程:指為其他線程提供服務(wù)的線程,也稱為守護(hù)線程。JVM的垃圾回收線程就是一個(gè)后臺(tái)線程。用戶線程和守護(hù)線程的區(qū)別在于,是否等待主線程依賴于主線程結(jié)束而結(jié)束

前臺(tái)線程:是指接受后臺(tái)線程服務(wù)的線程,其實(shí)前臺(tái)后臺(tái)線程是聯(lián)系在一起,就像傀儡和幕后操縱者一樣的關(guān)系??苁乔芭_(tái)線程、幕后操縱者是后臺(tái)線程。由前臺(tái)線程創(chuàng)建的線程默認(rèn)也是前臺(tái)線程??梢酝ㄟ^isDaemon()和setDaemon()方法來判斷和設(shè)置一個(gè)線程是否為后臺(tái)線程。

可見進(jìn)程:可見進(jìn)程是指一些不在前臺(tái),但用戶依然可見的進(jìn)程,舉例來說:各種widget、輸入法等,都屬于visibe。這部分進(jìn)程雖然不在前臺(tái),但與我們的使用也是密切相關(guān),我們并不希望它被系統(tǒng)終止。

“前臺(tái)可見進(jìn)程服務(wù)于后臺(tái)空進(jìn)程”——這是記錄線程重要性的口訣,

重要性一次遞減即,前臺(tái)進(jìn)程>可見進(jìn)程>服務(wù)進(jìn)程>后臺(tái)進(jìn)程>空進(jìn)程。

線程類的一些常用方法:

sleep(): 強(qiáng)迫一個(gè)線程睡眠N毫秒。

isAlive(): 判斷一個(gè)線程是否存活。

join(): 等待線程終止。

activeCount(): 程序中活躍的線程數(shù)。

enumerate(): 枚舉程序中的線程。

currentThread(): 得到當(dāng)前線程。

isDaemon(): 一個(gè)線程是否為守護(hù)線程。

setDaemon(): 設(shè)置一個(gè)線程為守護(hù)線程。(用戶線程和守護(hù)線程的區(qū)別在于,是否等待主線程依賴于主線程結(jié)束而結(jié)束)

setName(): 為線程設(shè)置一個(gè)名稱。

wait(): 強(qiáng)迫一個(gè)線程等待。

notify(): 通知一個(gè)線程繼續(xù)運(yùn)行。

setPriority(): 設(shè)置一個(gè)線程的優(yōu)先級(jí)。

補(bǔ)充:java處理線程阻塞的小技巧

在java中我們使用多線程去處理一些業(yè)務(wù),如果業(yè)務(wù)比較復(fù)雜且當(dāng)并發(fā)量有挺大的時(shí)候,很有可能出現(xiàn)線程阻塞的問題。

案例:

有一個(gè)觸發(fā)接口,根據(jù)觸發(fā)的信息內(nèi)部開啟多個(gè)線程去執(zhí)行業(yè)務(wù),每個(gè)線程都會(huì)去執(zhí)行兩種業(yè)務(wù):私有業(yè)務(wù)(比如調(diào)用不同的接口)、公共業(yè)務(wù)(比如執(zhí)行存儲(chǔ)、mq發(fā)送等等),當(dāng)私有業(yè)務(wù)處理時(shí)間很快而公共業(yè)務(wù)處理時(shí)間比較長(zhǎng),這樣的情景下就可以把私有業(yè)務(wù)和公共業(yè)務(wù)分到不同線程執(zhí)行。

例如:

當(dāng)觸發(fā)了這個(gè)接口,根據(jù)接口觸發(fā)的信息,需要開啟10個(gè)線程,那么就可以創(chuàng)建10個(gè)線程去執(zhí)行它的私有業(yè)務(wù),然后再額外創(chuàng)建一個(gè)線程去拿到前面那10個(gè)線程的執(zhí)行返回結(jié)果并進(jìn)行公共業(yè)務(wù)的處理。

這樣有個(gè)好處,就是能讓線程池很快的回收線程,能有效防止線程的阻塞

量化:

單個(gè)私有業(yè)務(wù)1秒鐘能執(zhí)行完成,單個(gè)公共業(yè)務(wù)需要5秒鐘才能執(zhí)行完成,如果接口被觸發(fā),發(fā)現(xiàn)需要?jiǎng)?chuàng)建100個(gè)線程執(zhí)行,那么線程池回收這些線程池至少需要等待6秒,如果按照前面說的分成兩個(gè)線程,那么就需要?jiǎng)?chuàng)建101個(gè)線程,而1秒后就能回收掉執(zhí)行完成的100個(gè)線程

但是這里需要做權(quán)衡,如果接口被觸發(fā)的時(shí)候發(fā)現(xiàn)需要開啟的線程比較多且公共業(yè)務(wù)很耗時(shí),這種情況下執(zhí)行公共業(yè)務(wù)只有單個(gè)線程同步執(zhí)行,那么這個(gè)線程就會(huì)執(zhí)行比較長(zhǎng)的時(shí)間,所以執(zhí)行公共業(yè)務(wù)的時(shí)候也可根據(jù)實(shí)際情況開啟多個(gè)線程。

下面寫了個(gè)小demo:1.私有業(yè)務(wù)的類:

@Componentpublic class Calculation { public Result cal(String req, int a, int b) { System.out.println('請(qǐng)求id:' + req + ' 結(jié)果:' + (a + b)); return new Result(req, a + b); }}2.公共業(yè)務(wù)的類:

@Componentpublic class SomethingElse { public void doElse(Result result) { try { System.out.println(Thread.currentThread().getName() + ' : 開始做其他事情,請(qǐng)求號(hào):' + result.getReq() + ' ,請(qǐng)求結(jié)果:' + result.getSum()); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + ' : 完成做其他事情,請(qǐng)求號(hào):' + result.getReq() + ' ,請(qǐng)求結(jié)果:' + result.getSum()); } catch (InterruptedException e) { } }}3.私有業(yè)務(wù)的線程類:

public class CallTask implements Callable<Result> { private String req; private int a; private int b; @Override public Result call() throws Exception { Calculation calculation = Main.applicationContext.getBean(Calculation.class); return calculation.cal(req, a, b); } public CallTask(String req, int a, int b) { this.req = req; this.a = a; this.b = b; } // getter and setter 等等}4.公共業(yè)務(wù)的線程類:

public class ElseTask implements Runnable { private CompletionService<Result> cs; private int threadCount; public ElseTask(CompletionService<Result> cs, int threadCount) { this.cs = cs; this.threadCount = threadCount; } @Override public void run() { SomethingElse somethingElse = Main.applicationContext.getBean(SomethingElse.class); doElse(somethingElse); } private void doElse(SomethingElse somethingElse) { try { for (int i = 0; i < threadCount; i++) {Future<Result> take = cs.take();Result result = take.get();somethingElse.doElse(result); } } catch (Exception e) { } } // getter and setter 等等}6.測(cè)試主方法:

@Servicepublic class Main implements ApplicationContextAware { public static ApplicationContext applicationContext = null; public static void main(String[] args) throws InterruptedException { AbstractApplicationContext appContext = new ClassPathXmlApplicationContext('application01.xml'); ExecutorService executorService = Executors.newFixedThreadPool(100); CompletionService<Result> cs = new ExecutorCompletionService(executorService); //這里啟動(dòng)執(zhí)行計(jì)算的線程 cs.submit(new CallTask('req001', 0, 1)); cs.submit(new CallTask('req002', 0, 2)); cs.submit(new CallTask('req003', 0, 3)); cs.submit(new CallTask('req004', 0, 4)); cs.submit(new CallTask('req005', 0, 5)); //專門的監(jiān)控線程,并執(zhí)行其他耗時(shí)的線程 executorService.execute(new ElseTask(cs, 5)); executorService.shutdown(); appContext.registerShutdownHook(); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; }}

執(zhí)行結(jié)果如下:

聊聊Java中是什么方法導(dǎo)致的線程阻塞

核心思想: 將多線程的公有的業(yè)務(wù)抽出來(前提是公有業(yè)務(wù)比較耗時(shí),不然就沒必要了)在其他線程里面執(zhí)行。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
神马日本精品| 国产毛片久久| 18国产精品| 视频一区中文字幕精品| 久久国产高清| 日韩视频一区| 美女网站久久| 婷婷综合成人| 欧美日韩中文| 国产精品17p| 国内精品美女在线观看| 国产h片在线观看| 国产一区二区三区亚洲综合| 色综合五月天| 日韩一区二区三区免费| 五月精品视频| 日韩精品一二三四| 婷婷成人av| 国产精品一区二区美女视频免费看| 欧美交a欧美精品喷水| 久久99国产精品视频| 国产一区二区精品福利地址| 日韩成人精品一区| 久久视频一区| 亚洲精品123区| 亚洲精品成a人ⅴ香蕉片| 777久久精品| 国产精品亚洲二区| 久久精品九色| 久久久久久久久久久妇女| 欧美精品一二| 蜜桃视频第一区免费观看| 日本va欧美va欧美va精品| 麻豆视频观看网址久久| 久久激情婷婷| 亚洲精品欧美| 精品一区二区三区中文字幕视频| 亚洲www啪成人一区二区| 蜜臀久久久99精品久久久久久| 日本麻豆一区二区三区视频| 麻豆免费精品视频| 免费精品国产| 亚洲无线观看| 美女视频免费精品| 欧美日韩在线观看视频小说| 婷婷综合福利| 日韩中文影院| 亚洲18在线| 精品久久久网| 亚洲一区av| 国产一区日韩| 水蜜桃久久夜色精品一区的特点| 久久xxx视频| 国产精品99免费看| 国产日本精品| 1024精品久久久久久久久| 国产亚洲字幕| 亚洲精品福利电影| 免费看精品久久片| 老司机免费视频一区二区| 黄色亚洲在线| 国产aa精品| 三级一区在线视频先锋| 国产精品nxnn| 一级欧洲+日本+国产| 欧美偷窥清纯综合图区| 99久久亚洲精品蜜臀| 91久久精品无嫩草影院| 日韩欧美二区| 97精品国产99久久久久久免费| 色一区二区三区四区| 亚洲影院天堂中文av色| 精品欠久久久中文字幕加勒比| 亚洲欧美日韩专区| 国产一区二区三区四区二区| 蜜臀久久99精品久久久久久9| 国产精品二区不卡| 欧美一级网址| 99在线精品免费视频九九视 | 国产精品久久久一区二区| 久久亚洲国产| 国产精品1区在线| 蜜臀a∨国产成人精品| 亚洲精品一级二级| 欧美中文高清| 亚洲综合丁香| 99久久久国产精品美女| 精品欠久久久中文字幕加勒比| 亚洲精品影视| 国产女优一区| 国产综合亚洲精品一区二| 欧美日韩一区自拍| 六月丁香综合在线视频| 欧美色综合网| 国产精品丝袜xxxxxxx| 成人在线视频中文字幕| 日韩国产欧美在线播放| 黄色国产精品| 成人午夜在线| 日韩在线成人| 黄色欧美日韩| 在线中文字幕播放| 国产欧美成人| 丝袜美腿一区二区三区| 亚洲www啪成人一区二区| 国产剧情一区| 一区二区三区网站| 亚洲欧美日韩高清在线| 日韩一区三区| 国产成人1区| 国产精品sss在线观看av| 日韩中文字幕在线一区| 在线亚洲观看| 久久人人99| 另类小说一区二区三区| 日本午夜精品久久久| 亚洲青青久久| 丝袜诱惑制服诱惑色一区在线观看 | 红桃视频国产精品| 国产精品精品国产一区二区| 欧美午夜网站| 日韩三级精品| 中文国产一区| 欧美jjzz| 亚洲午夜黄色| 色爱综合av| 成人日韩精品| 在线一区av| 国产精品专区免费| 日韩在线欧美| 久久久久.com| 日韩电影在线视频| 日韩国产专区| 中文字幕在线看片| 亚洲www啪成人一区二区| 欧洲av不卡| 色88888久久久久久影院| 日韩不卡在线| 色婷婷狠狠五月综合天色拍| 99精品美女| 欧美日韩激情| 亚洲综合日本| 蜜桃av一区二区在线观看| 一区二区国产在线| 天堂va在线高清一区| 国产欧美二区| 麻豆理论在线观看| 欧美日韩一区二区综合| 红桃视频国产精品| 丝袜脚交一区二区| 日本va欧美va欧美va精品| 国产精品久久久久久妇女 | 欧美精品黄色| 视频一区中文字幕| 日本视频在线一区| 久久一区视频| 日韩精品欧美激情一区二区| 91成人超碰| 视频一区欧美日韩| 日本91福利区| 久久久久伊人| 久久久久国产一区二区| 亚洲综合丁香| 国产精品亚洲人成在99www| 91国内精品| 国产精品99一区二区三| 国产专区一区| 日韩国产精品久久久| 久久精品毛片| 在线日韩电影| 日韩激情一二三区| 日韩av在线播放网址| 91成人精品视频| 日韩激情中文字幕| 亚洲天堂资源| 免费看欧美美女黄的网站| 国产精选一区| 欧美天堂视频| 久久国产66| 国产精品中文字幕亚洲欧美| 久久夜夜操妹子| 涩涩涩久久久成人精品| 久久久久免费| 久久成人精品| 精品视频亚洲| 狠狠色狠狠色综合日日tαg| 欧美私人啪啪vps| 国产高清不卡| 日韩1区2区3区| 日韩国产激情| 日韩 欧美一区二区三区| 国产精品伦理久久久久久| 亚洲少妇诱惑| 久久精品国产在热久久| 亚洲国产专区| 国产精品www.| 日韩影院在线观看| 人在线成免费视频| 亚洲区欧美区| 视频福利一区|