最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java線程間通信方式

 更新時(shí)間:2021年11月02日 14:45:05   作者:平平無(wú)奇小葉同學(xué)  
這篇文章主要為大家詳細(xì)介紹了Java線程間的通信方式,以代碼結(jié)合文字的方式來討論線程間的通信,感興趣的朋友可以參考一下

線程間通信方式有兩種:共享內(nèi)存消息傳遞。

不同進(jìn)程間線程通信等同于進(jìn)程間通信,同一進(jìn)程間可用共享內(nèi)存實(shí)現(xiàn)。

在共享內(nèi)存的并發(fā)模型里,線程之間共享程序的公共狀態(tài),線程之間通過寫-讀內(nèi)存中的公共狀態(tài)來隱式進(jìn)行通信,典型的共享內(nèi)存通信方式就是通過共享對(duì)象進(jìn)行通信。

在消息傳遞的并發(fā)模型里,線程之間沒有公共狀態(tài),線程之間必須通過明確的發(fā)送消息來顯式進(jìn)行通信,在java中典型的消息傳遞方式就是wait()和notify()。

詳細(xì)來說,線程通信有以下幾種方式:

1.volatile和synchronized關(guān)鍵字

volatile關(guān)鍵字保證了共享變量的可見性,任何線程需要讀取時(shí)都要到內(nèi)存中讀?。ù_保獲得最新值)。synchronized關(guān)鍵字確保只能同時(shí)有一個(gè)線程訪問方法或者變量,保證了線程訪問的可見性和排他性。

synchronized底層是基于監(jiān)視器(Monitor)的獲取,每個(gè)對(duì)象都有自己的監(jiān)視器,線程必須獲得監(jiān)視器才能繼續(xù)執(zhí)行內(nèi)容。

在這里插入圖片描述

2.等待/通知機(jī)制

等待/通知機(jī)制,是指一個(gè)線程A調(diào)用了對(duì)象O的wait()方法進(jìn)入等待狀態(tài),而另一個(gè)線程B 調(diào)用了對(duì)象O的notify()或者notifyAll()方法,線程A收到通知后從對(duì)象O的wait()方法返回,進(jìn)而 執(zhí)行后續(xù)操作。上述兩個(gè)線程通過對(duì)象O來完成交互,而對(duì)象上的wait()和notify/notifyAll()的 關(guān)系就如同開關(guān)信號(hào)一樣,用來完成等待方和通知方之間的交互工作(注意此機(jī)制要和鎖一起使用,調(diào)用notify的線程執(zhí)行完后釋放了鎖新喚醒線程才能運(yùn)行)。

在這里插入圖片描述

3.管道輸入/輸出流

管道輸入/輸出流和普通的文件輸入/輸出流或者網(wǎng)絡(luò)輸入/輸出流不同之處在于,它主要 用于線程之間的數(shù)據(jù)傳輸,而傳輸?shù)拿浇闉閮?nèi)存。

管道輸入/輸出流主要包括了如下4種具體實(shí)現(xiàn):PipedOutputStreamPipedInputStream、 PipedReaderPipedWriter,前兩種面向字節(jié),而后兩種面向字符。

    public class Piped {
        public static void main(String[] args) throws Exception {
            PipedWriter out = new PipedWriter();
            PipedReader in = new PipedReader(); // 將輸出流和輸入流進(jìn)行連接,否則在使用時(shí)會(huì)拋出IOException
            out.connect(in);
            Thread printThread = new Thread(new Print(in), "PrintThread");
            printThread.start();
            int receive = 0;
            try {
                while ((receive = System.in.read()) != -1) {
                    out.write(receive);
                }
            } finally {
                out.close();
            }
        }
        static class Print implements Runnable {
            private PipedReader in;
            public Print(PipedReader in) {
                this.in = in;
            }
            public void run() {
                int receive = 0;
                try {
                    while ((receive = in.read()) != -1) {
                        System.out.print((char) receive);
                    }
                } catch (IOException ex) {
                }
            }
        }
    }

4.join()方法

如果一個(gè)線程A執(zhí)行了thread.join()語(yǔ)句,其含義是:當(dāng)前線程A等待thread線程終止之后才 從thread.join()返回。線程Thread除了提供join()方法之外,還提供了join(long millis)和join(long millis,int nanos)兩個(gè)具備超時(shí)特性的方法。這兩個(gè)超時(shí)方法表示,如果線程thread在給定的超時(shí) 時(shí)間里沒有終止,那么將會(huì)從該超時(shí)方法中返回。

每個(gè)線程終止的前提是前驅(qū)線程的終止,每個(gè)線程等待前驅(qū)線程終止后,才從join()方法返回,這里涉及了等待/通知機(jī)制(等待前驅(qū)線程結(jié)束,接收前驅(qū)線程結(jié)束通知)。

5.ThreadLocal()方法

ThreadLocal,即線程本地變量(每個(gè)線程都有自己唯一的一個(gè)哦),是一個(gè)以ThreadLocal對(duì)象為鍵、任意對(duì)象為值的存儲(chǔ)結(jié)構(gòu)。底層是一個(gè)ThreadLocalMap來存儲(chǔ)信息,key是弱引用,value是強(qiáng)引用,所以使用完畢后要及時(shí)清理(尤其使用線程池時(shí))。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java SpringMVC實(shí)現(xiàn)國(guó)際化整合案例分析(i18n)

    Java SpringMVC實(shí)現(xiàn)國(guó)際化整合案例分析(i18n)

    本篇文章主要介紹了Java SpringMVC實(shí)現(xiàn)國(guó)際化整合案例分析(i18n),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 基于SpringBoot實(shí)現(xiàn)圖片上傳與顯示

    基于SpringBoot實(shí)現(xiàn)圖片上傳與顯示

    這篇文章主要為大家詳細(xì)介紹了基于SpringBoot實(shí)現(xiàn)圖片上傳與顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • springboot過濾器和攔截器的實(shí)例代碼

    springboot過濾器和攔截器的實(shí)例代碼

    這篇文章主要介紹了springboot過濾器和攔截器的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法

    IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法

    這篇文章主要介紹了IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java代碼抓取網(wǎng)頁(yè)郵箱的實(shí)現(xiàn)方法

    java代碼抓取網(wǎng)頁(yè)郵箱的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava代碼抓取網(wǎng)頁(yè)郵箱的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • java中InputStream轉(zhuǎn)為MultipartFile的解決方案

    java中InputStream轉(zhuǎn)為MultipartFile的解決方案

    這篇文章主要介紹了java中InputStream轉(zhuǎn)為MultipartFile的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringBoot全局處理統(tǒng)一返回類型方式

    SpringBoot全局處理統(tǒng)一返回類型方式

    這篇文章主要介紹了SpringBoot全局處理統(tǒng)一返回類型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 教你bat腳本一鍵配置java開發(fā)環(huán)境

    教你bat腳本一鍵配置java開發(fā)環(huán)境

    公司新入職一名員工,項(xiàng)目經(jīng)理讓我安排新人工作,首先需要對(duì)java開發(fā)相關(guān)環(huán)境進(jìn)行配置安裝,但時(shí)常會(huì)因?yàn)榘惭b配置不到位或者操作錯(cuò)誤導(dǎo)致時(shí)間的浪費(fèi),所以在空余時(shí)間收集了一系列軟件的免安裝版本,感興趣的朋友一起看看吧
    2021-12-12
  • Hibernate之環(huán)境搭建及demo分享

    Hibernate之環(huán)境搭建及demo分享

    下面小編就為大家分享一篇Hibernate之環(huán)境搭建及demo,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • Java Feign微服務(wù)接口調(diào)用方法詳細(xì)講解

    Java Feign微服務(wù)接口調(diào)用方法詳細(xì)講解

    現(xiàn)如今微服務(wù)架構(gòu)十分流行,而采用微服務(wù)構(gòu)建系統(tǒng)也會(huì)帶來更清晰的業(yè)務(wù)劃分和可擴(kuò)展性。java如果使用微服務(wù)就離不開springcloud,我這里是把服務(wù)注冊(cè)到nacos上,各個(gè)服務(wù)之間的調(diào)用使用feign
    2023-01-01

最新評(píng)論

海伦市| 开封县| 黄骅市| 靖远县| 涿鹿县| 遂平县| 黄陵县| 永济市| 祁门县| 黄冈市| 沙洋县| 钟山县| 衡水市| 朝阳市| 大港区| 德惠市| 二连浩特市| 镇雄县| 广元市| 铅山县| 衡山县| 金山区| 贺兰县| 灌阳县| 吉林省| 阿图什市| 张家川| 绥江县| 花垣县| 嘉荫县| 抚松县| 府谷县| 无棣县| 银川市| 镇江市| 乐至县| 阳曲县| 栾川县| 小金县| 收藏| 宁海县|