真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java同步阻塞怎么實(shí)現(xiàn)

本篇內(nèi)容介紹了“Java同步阻塞怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供南充網(wǎng)站建設(shè)、南充做網(wǎng)站、南充網(wǎng)站設(shè)計(jì)、南充網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、南充企業(yè)網(wǎng)站模板建站服務(wù),十余年南充做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

一:分布式架構(gòu)網(wǎng)絡(luò)通信

在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問(wèn)題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技 術(shù),例如:RMI、Hessian、SOAP、ESB和JMS等

1.1:基本原理

要實(shí)現(xiàn)網(wǎng)絡(luò)機(jī)器間的通訊,需要做的就是將流從一臺(tái)計(jì)算機(jī)傳輸?shù)搅硗庖慌_(tái)計(jì)算機(jī),基于傳輸協(xié)議和網(wǎng)絡(luò)IO來(lái)實(shí)現(xiàn)。

  • 其中傳輸協(xié)議比較出名的有tcp、udp等,tcp、udp都是在基于Socket概念上為某類應(yīng)用場(chǎng)景而擴(kuò)展出的傳輸協(xié)議。

  • 網(wǎng)絡(luò)IO,主要有BIO、NIO、AIO三種方式

1.2:RPC

RPC全稱為remote procedure call,即遠(yuǎn)程過(guò)程調(diào)用。借助RPC可以做到像本地調(diào)用一樣調(diào)用遠(yuǎn)程服務(wù),是一種進(jìn)程間的通信方式。常見(jiàn)的RPC框架有:Hessian、gRPC、Thrift、HSF、Dubbo等。

注意:需要注意的是RPC并不是一個(gè)具體的技術(shù),而是指整個(gè)網(wǎng)絡(luò)遠(yuǎn)程調(diào)用過(guò)程;對(duì) 于RPC框架而言,核心模塊就是通訊序列化。

遠(yuǎn)程過(guò)程調(diào)用分為兩種,現(xiàn)在在服務(wù)間通信的方式也基本以這兩種為主:

  • 基于HTTP的restful形式的廣義遠(yuǎn)程調(diào)用,以spring could的feign和restTemplate為代表,采用的協(xié)議是HTTP的7層調(diào)用協(xié)議,并且協(xié)議的參數(shù)和響應(yīng)序列化基本以JSON格式和XML格式為主。

  • 基于TCP的狹義的RPC遠(yuǎn)程調(diào)用,以阿里的Dubbo為代表,主要通過(guò)netty來(lái)實(shí)現(xiàn)4層網(wǎng)絡(luò)協(xié)議,NIO來(lái)異步傳輸,序列化可以是JSON或者h(yuǎn)essian2以及java自帶的序列化等,可以配置。

1.2.1 RPC架構(gòu)

一個(gè)完整的RPC架構(gòu)里面包含了四個(gè)核心的組件,分別是Client,Client Stub,Server以及Server Stub,這個(gè)Stub 可以理解為存根。

  • 客戶端(Client),服務(wù)的調(diào)用方。

  • 客戶端存根(Client Stub),存放服務(wù)端的地址消息,再將客戶端的請(qǐng)求參數(shù)打包成網(wǎng)絡(luò)消息,然后通過(guò)網(wǎng)絡(luò)遠(yuǎn)程發(fā)送給服務(wù)方。

  • 服務(wù)端(Server),真正的服務(wù)提供者。

  • 服務(wù)端存根(Server Stub),接收客戶端發(fā)送過(guò)來(lái)的消息,將消息解包,并調(diào)用本地的方法。

Java同步阻塞怎么實(shí)現(xiàn)

1.2.2 RPC調(diào)用過(guò)程

Java同步阻塞怎么實(shí)現(xiàn)

注意:無(wú)論是何種類型的數(shù)據(jù),最終都需要轉(zhuǎn)換成二進(jìn)制流在網(wǎng)絡(luò)上進(jìn)行傳輸,數(shù)據(jù)的發(fā)送方需要將對(duì)象轉(zhuǎn)換為二進(jìn)制流(序列化),而數(shù)據(jù)的接收方則需要把二進(jìn)制流再恢復(fù)為對(duì)象(反序列化)。

1.3:RMI

Java RMI 指的是遠(yuǎn)程方法調(diào)用 (Remote Method Invocation),是java原生支持的遠(yuǎn)程調(diào)用 ,采用JRMP(Java Remote Messageing protocol)作為通信協(xié)議,可以認(rèn)為是純java版本的分布式遠(yuǎn)程調(diào)用解決方案, RMI主要用 于不同虛擬機(jī)之間的通信,這些虛擬機(jī)可以在不同的主機(jī)上、也可以在同一個(gè)主機(jī)上,因此這里的通信可以理解為一個(gè) 虛擬機(jī)上的對(duì)象調(diào)用另一個(gè)虛擬機(jī)上對(duì)象的方法。

1.3.1 RMI簡(jiǎn)介

注冊(cè)表:
注冊(cè)表(Registry):以URL形式注冊(cè)遠(yuǎn)程對(duì)象,并向客戶端回復(fù)對(duì)遠(yuǎn)程對(duì)象的引用。

客戶端:

  1. 存根/樁(Stub):遠(yuǎn)程對(duì)象在客戶端上的代理;

  2. 遠(yuǎn)程引用層(Remote Reference Layer):解析并執(zhí)行遠(yuǎn)程引用協(xié)議;

  3. 傳輸層(Transport):發(fā)送調(diào)用、傳遞遠(yuǎn)程方法參數(shù)、接收遠(yuǎn)程方法執(zhí)行結(jié)果。

服務(wù)端:

  1. 骨架(Skeleton):讀取客戶端傳遞的方法參數(shù),調(diào)用服務(wù)器方的實(shí)際對(duì)象方法,并接收方法執(zhí)行后的返回值;

  2. 遠(yuǎn)程引用層(Remote Reference Layer):處理遠(yuǎn)程引用后向骨架發(fā)送遠(yuǎn)程方法調(diào)用;

  3. 傳輸層(Transport):監(jiān)聽(tīng)客戶端的入站連接,接收并轉(zhuǎn)發(fā)調(diào)用到遠(yuǎn)程引用層。

1.3.2 RMI調(diào)用過(guò)程

Java同步阻塞怎么實(shí)現(xiàn)

遠(yuǎn)程調(diào)用過(guò)程:
1)客戶端從遠(yuǎn)程服務(wù)器的注冊(cè)表中查詢并獲取遠(yuǎn)程對(duì)象引用。
2)樁對(duì)象與遠(yuǎn)程對(duì)象具有相同的接口和方法列表,當(dāng)客戶端調(diào)用遠(yuǎn)程對(duì)象時(shí),實(shí)際上是由相應(yīng)的樁對(duì)象代理完成的。
3 ) 遠(yuǎn)程引用層在將樁的本地引用轉(zhuǎn)換為服務(wù)器上對(duì)象的遠(yuǎn)程引用后,再將調(diào)用傳遞給傳輸層(Transport),由傳輸層通 過(guò)TCP協(xié)議發(fā)送調(diào)用;
4)在服務(wù)器端,傳輸層監(jiān)聽(tīng)入站連接,它一旦接收到客戶端遠(yuǎn)程調(diào)用后,就將這個(gè)引用轉(zhuǎn)發(fā)給其上層的遠(yuǎn)程引用層;
5)服務(wù)器端的遠(yuǎn)程引用層將客戶端發(fā)送的遠(yuǎn)程應(yīng)用轉(zhuǎn)換為本地虛擬機(jī)的引用后,再將請(qǐng)求傳遞給骨架(Skeleton);
6)骨架讀取參數(shù),又將請(qǐng)求傳遞給服務(wù)器,最后由服務(wù)器進(jìn)行實(shí)際的方法調(diào)用。

1.4:BIO、NIO、AIO

BIO:同步阻塞的;NIO:同步非阻塞的;AIO:異步非阻塞的。

同步與異步(針對(duì)應(yīng)用程序與內(nèi)核的交互):

  • 同步:用戶進(jìn)程觸發(fā)IO操作時(shí),使用等待或者輪訓(xùn)的方式查看IO操作是否就緒
    例如:銀行取錢(qián),我自己去取錢(qián),取錢(qián)的過(guò)程中等待。

  • 異步:當(dāng)一個(gè)異步進(jìn)程調(diào)用發(fā)出之后,調(diào)用者不會(huì)立刻得到結(jié)果。而是在調(diào)用發(fā)出之后,被調(diào)用者通過(guò)狀態(tài)、通知來(lái)通知調(diào)用者,或者通過(guò)回調(diào)函數(shù)來(lái)處理這個(gè)調(diào)用。
    例如:我請(qǐng)朋友幫我取錢(qián),他取到錢(qián)后返回給我.

阻塞與非阻塞(針對(duì)進(jìn)程訪問(wèn)數(shù)據(jù)(讀寫(xiě)操作)的時(shí)候,根據(jù)IO操作的就緒狀態(tài)采取不同的方式):

  • 阻塞:阻塞方式下讀取和寫(xiě)入將一直等待。
    例: ATM機(jī)排隊(duì)取款,你只能一直等待排隊(duì)取款

  • 非阻塞:使用非阻塞IO時(shí),如果不能讀寫(xiě)Java調(diào)用會(huì)馬上返回,當(dāng)IO事件分發(fā)器會(huì)通知可讀寫(xiě)時(shí)再繼續(xù)進(jìn)行讀寫(xiě),不斷循環(huán)直到讀寫(xiě)完成
    例:柜臺(tái)取款,取個(gè)號(hào),然后坐在椅子上做其他事,等廣播通知,沒(méi)到你的號(hào)你就不能去,但你可以不斷的問(wèn)大堂經(jīng)理排到了沒(méi)有。

1.4.1 BIO(同步阻塞)

BIO:同步阻塞IO,B代表blocking。服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程,即客戶端有連接請(qǐng)求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程進(jìn)行處理,如果這個(gè)連接不做任何事情會(huì)造成不必要的線程開(kāi)銷,當(dāng)然可以通過(guò)線程池機(jī)制改善。

Java同步阻塞怎么實(shí)現(xiàn)

簡(jiǎn)單實(shí)現(xiàn):

  1. 服務(wù)端代碼

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket();
        serverSocket.bind(new InetSocketAddress("127.0.0.1",8888));
        while (true){
            // 同步阻塞
            Socket socket = serverSocket.accept();
            new Thread(()->{
                try {
                    byte[] bytes = new byte[1024];
                    int len = socket.getInputStream().read(bytes);
                    System.out.println(new String(bytes,0,len));
                    socket.getOutputStream().write(bytes,0,len);
                    socket.getOutputStream().flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
  1. 客戶端代碼

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        socket.getOutputStream().write("hello".getBytes());
        socket.getOutputStream().flush();
        System.out.println("server send back data =====");
        byte[] bytes = new byte[1024];
        int len = socket.getInputStream().read(bytes);
        System.out.println(new String(bytes,0,len));
    }

1.4.2 NIO(同步非阻塞)

同步非阻塞IO (non-blocking IO / new io)。服務(wù)器實(shí)現(xiàn)模式為一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)通道(Channel),即客戶端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢到連接有IO請(qǐng)求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理。

  • 通道(Channels):Channel 數(shù)據(jù)連接的通道。 數(shù)據(jù)可以從Channel讀到Buffer中,也可以從Buffer 寫(xiě)到Channel中 .

  • 緩沖區(qū)(Buffers):通道channel可以向緩沖區(qū)Buffer中寫(xiě)數(shù)據(jù),也可以像buffer中存數(shù)據(jù)。

  • 選擇器(Selector):使用選擇器,借助單一線程,就可對(duì)數(shù)量龐大的活動(dòng) I/O 通道實(shí)時(shí)監(jiān)控和維護(hù)。

Java同步阻塞怎么實(shí)現(xiàn)

NIO的特點(diǎn)

Java同步阻塞怎么實(shí)現(xiàn)

當(dāng)一個(gè)連接創(chuàng)建后,不會(huì)需要對(duì)應(yīng)一個(gè)線程,這個(gè)連接會(huì)被注冊(cè)到多路復(fù)用器,所有的連接只需要一個(gè)線程就可以操作,該線程的多路復(fù)用器會(huì)輪詢,發(fā)現(xiàn)連接有請(qǐng)求時(shí),才開(kāi)啟一個(gè)線程處理。

Java同步阻塞怎么實(shí)現(xiàn)

NIO模型中selector的作用,一條連接來(lái)了之后,現(xiàn)在不創(chuàng)建一個(gè)while死循環(huán)去監(jiān)聽(tīng)是否有數(shù)據(jù)可讀了,而是直接把這條連接注冊(cè)到selector上,然后,通過(guò)檢查這個(gè)selector,就可以批量監(jiān)測(cè)出有數(shù)據(jù)可讀的連接,進(jìn)而讀取數(shù)據(jù),

NIO的使用

nio的使用示例

1.4.3 AIO(異步非阻塞)

異步非阻塞IO。A代表asynchronize

特點(diǎn):

  • 當(dāng)有流可以讀時(shí),操作系統(tǒng)會(huì)將可以讀的流傳入read方法的緩沖區(qū),并通知應(yīng)用程序,

  • 對(duì)于寫(xiě)操作,OS將write方法的流寫(xiě)入完畢時(shí)操作系統(tǒng)會(huì)主動(dòng)通知應(yīng)用程序。因此read和write都是異步 的,完成后會(huì)調(diào)用回調(diào)函數(shù)。

Java同步阻塞怎么實(shí)現(xiàn)

使用場(chǎng)景: 連接數(shù)目多且連接比較長(zhǎng)(重操作)的架構(gòu),比如相冊(cè)服務(wù)器。重點(diǎn)調(diào)用了OS參與并發(fā)操作,Java7開(kāi)始支持。

“Java同步阻塞怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


分享題目:Java同步阻塞怎么實(shí)現(xiàn)
網(wǎng)頁(yè)路徑:http://weahome.cn/article/pcgsee.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部