一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談Java線程間通信方式

淺談Java線程間通信方式

2022-03-09 00:48平平無奇小葉同學 Java教程

這篇文章主要為大家詳細介紹了Java線程間的通信方式,以代碼結合文字的方式來討論線程間的通信,感興趣的朋友可以參考一下

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

不同進程間線程通信等同于進程間通信,同一進程間可用共享內存實現。

在共享內存的并發模型里,線程之間共享程序的公共狀態,線程之間通過寫-讀內存中的公共狀態來隱式進行通信,典型的共享內存通信方式就是通過共享對象進行通信。

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

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

1.volatile和synchronized關鍵字

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

synchronized底層是基于監視器(Monitor)的獲取,每個對象都有自己的監視器,線程必須獲得監視器才能繼續執行內容。

淺談Java線程間通信方式

2.等待/通知機制

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

淺談Java線程間通信方式

3.管道輸入/輸出流

管道輸入/輸出流和普通的文件輸入/輸出流或者網絡輸入/輸出流不同之處在于,它主要 用于線程之間的數據傳輸,而傳輸的媒介為內存。

管道輸入/輸出流主要包括了如下4種具體實現:PipedOutputStreamPipedInputStream PipedReaderPipedWriter,前兩種面向字節,而后兩種面向字符。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Piped {
    public static void main(String[] args) throws Exception {
        PipedWriter out = new PipedWriter();
        PipedReader in = new PipedReader(); // 將輸出流和輸入流進行連接,否則在使用時會拋出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()方法

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

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

5.ThreadLocal()方法

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

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/weixin_46263596/article/details/121035160

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费在线观看成年人视频 | 成年人在线免费观看视频网站 | 欧美日韩中文字幕久久伊人 | 日本在线你懂的 | 国产亚洲人成网站天堂岛 | 娜娜啪| 日本三级大学生17 | 特黄特a级特别特级特毛片 特黄a级三级三级野战 | 吻戏辣妞范1000免费体验 | 欧美久久久久久 | 青青操在线播放 | 国产一区二区免费福利片 | 色偷偷亚洲男人 | 性色AV乱码一区二区三区视频 | 日韩欧美国产免费看清风阁 | 亚洲天天做夜夜做天天欢 | 亚洲国产精品一区二区久久 | 18日本xxxxxxⅹxx96 | 日本 视频 在线 | 亚洲欧美一区二区三区不卡 | 91国产在线第7页 | 日韩中文字幕在线不卡 | 性欧美金发洋妞xxxxbbbb | 男同激情视频 | 扒开女人下面使劲桶屁股动漫 | 精品国产福利片在线观看 | 韩国三级 720p | 太大了轻点阿受不了小说h 四色6677最新永久网站 | 亚洲AV永久无码精品老司机蜜桃 | 岛国在线播放v片免费 | 欧美xxx000喷水 | 日本免费一区二区三区四区五六区 | 国产小视频在线播放 | 欧美亚洲国产精品久久第一页 | 免费稚嫩福利 | 西施打开双腿下面好紧 | 99re这里只有精品在线观看 | 欧美日韩国产最新一区二区 | 三极片在线观看 | 欧美a级v片在线观看一区 | 国产精品nv在线观看 |