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

Java中的同步非阻塞IO模型詳解

 更新時(shí)間:2024年01月23日 10:54:37   作者:北漂碼農(nóng)有話(huà)說(shuō)  
這篇文章主要介紹了Java中的同步非阻塞IO模型詳解,同步非阻塞IO模型,我們能夠知道,用戶(hù)線(xiàn)程一直發(fā)送請(qǐng)求,內(nèi)核一直都能都?jí)蚍祷?nbsp;,直到內(nèi)核完成準(zhǔn)備數(shù)據(jù)、數(shù)據(jù)拷貝的工作,并且返回成功的指示,在此過(guò)程中用戶(hù)線(xiàn)程不是阻塞的狀態(tài),需要的朋友可以參考下

介紹

IO模型中的,同步非阻塞IO模型,我們能夠知道,用戶(hù)線(xiàn)程一直發(fā)送請(qǐng)求,內(nèi)核一直都能都?jí)蚍祷?,直到內(nèi)核完成準(zhǔn)備數(shù)據(jù)、數(shù)據(jù)拷貝的工作。

并且返回成功的指示。在此過(guò)程中用戶(hù)線(xiàn)程不是阻塞的狀態(tài)

實(shí)現(xiàn)

使用java來(lái)實(shí)現(xiàn)同步非阻塞IO模型,即我們所說(shuō)的NIO的模型

客戶(hù)端實(shí)現(xiàn)

/**
 * @author:triumphxx
 * @Date:2021/11/12
 * @Time:11:03 下午
 * @微信公眾號(hào):北漂碼農(nóng)有話(huà)說(shuō)
 * @網(wǎng)站:http://blog.triumphxx.com.cn
 * @GitHub https://github.com/triumphxx
 * @Desc: NIO編程模型客戶(hù)端
 **/
public class NIOClient {
    // 通道管理器(Selector)
    private static Selector selector;
    public static void main(String[] args) throws IOException {
        // 創(chuàng)建通道管理器(Selector)
        selector = Selector.open();
        // 創(chuàng)建通道SocketChannel
        SocketChannel channel = SocketChannel.open();
        // 將通道設(shè)置為非阻塞
        channel.configureBlocking(false);
        // 客戶(hù)端連接服務(wù)器,其實(shí)方法執(zhí)行并沒(méi)有實(shí)現(xiàn)連接,需要在handleConnect方法中調(diào)channel.finishConnect()才能完成連接
        channel.connect(new InetSocketAddress("localhost", 9090));
        /**
         * 將通道(Channel)注冊(cè)到通道管理器(Selector),并為該通道注冊(cè)selectionKey.OP_CONNECT
         * 注冊(cè)該事件后,當(dāng)事件到達(dá)的時(shí)候,selector.select()會(huì)返回,
         * 如果事件沒(méi)有到達(dá)selector.select()會(huì)一直阻塞。
         */
        channel.register(selector, SelectionKey.OP_CONNECT);
        // 循環(huán)處理
        while (true) {
            /*
             * 選擇一組可以進(jìn)行I/O操作的事件,放在selector中,客戶(hù)端的該方法不會(huì)阻塞,
             * selector的wakeup方法被調(diào)用,方法返回,而對(duì)于客戶(hù)端來(lái)說(shuō),通道一直是被選中的
             * 這里和服務(wù)端的方法不一樣,查看api注釋可以知道,當(dāng)至少一個(gè)通道被選中時(shí)。
             */
            selector.select();
            // 獲取監(jiān)聽(tīng)事件
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = selectionKeys.iterator();
            // 迭代處理
            while (iterator.hasNext()) {
                // 獲取事件
                SelectionKey key = iterator.next();
                // 移除事件,避免重復(fù)處理
                iterator.remove();
                // 檢查是否是一個(gè)就緒的已經(jīng)連接服務(wù)端成功事件
                if (key.isConnectable()) {
                    handleConnect(key);
                } else if (key.isReadable()) {// 檢查套接字是否已經(jīng)準(zhǔn)備好讀數(shù)據(jù)
                    handleRead(key);
                }
            }
        }
    }
    /**
     * 處理客戶(hù)端連接服務(wù)端成功事件
     */
    private static void handleConnect(SelectionKey key) throws IOException {
        // 獲取與服務(wù)端建立連接的通道
        SocketChannel channel = (SocketChannel) key.channel();
        if (channel.isConnectionPending()) {
            // channel.finishConnect()才能完成連接
            channel.finishConnect();
        }
        channel.configureBlocking(false);
        // 數(shù)據(jù)寫(xiě)入通道
        String msg = "Hello Server!";
        channel.write(ByteBuffer.wrap(msg.getBytes()));
        // 通道注冊(cè)到選擇器,并且這個(gè)通道只對(duì)讀事件感興趣
        channel.register(selector, SelectionKey.OP_READ);
    }
    /**
     * 監(jiān)聽(tīng)到讀事件,讀取客戶(hù)端發(fā)送過(guò)來(lái)的消息
     */
    private static void handleRead(SelectionKey key) throws IOException {
        SocketChannel channel = (SocketChannel) key.channel();
        //開(kāi)辟堆內(nèi)緩沖區(qū)
        ByteBuffer buffer = ByteBuffer.allocate(128);
        // 從通道讀取數(shù)據(jù)到緩沖區(qū)
        channel.read(buffer);
        // 輸出服務(wù)端響應(yīng)發(fā)送過(guò)來(lái)的消息
        byte[] data = buffer.array();
        String msg = new String(data).trim();
        System.out.println("服務(wù)端發(fā)來(lái)的消息:" + msg);
    }
}

由客戶(hù)端的代碼可以知道:首先我們將 select 打開(kāi),然后創(chuàng)建通道、將通道設(shè)置為非阻塞、創(chuàng)建連接、完成注冊(cè) 等待監(jiān)聽(tīng)、處理事件,詳細(xì)的每一行代碼的意思,都已經(jīng)進(jìn)展標(biāo)注??创a即可。

服務(wù)端實(shí)現(xiàn)

**
 * @author:triumphxx
 * @Date:2021/11/12
 * @Time:11:03 下午
 * @微信公眾號(hào):北漂碼農(nóng)有話(huà)說(shuō)
 * @網(wǎng)站:http://blog.triumphxx.com.cn
 * @GitHub https://github.com/triumphxx
 * @Desc: NIO編程模型服務(wù)端
 **/
public class NIOServer {
    // 通道管理器(Selector)
    private static Selector selector;
    public static void main(String[] args) throws IOException {
        // 創(chuàng)建通道管理器(Selector)
        selector = Selector.open();
        // 創(chuàng)建通道ServerSocketChannel
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        // 將通道設(shè)置為非阻塞
        serverSocketChannel.configureBlocking(false);
        // 將ServerSocketChannel對(duì)應(yīng)的ServerSocket綁定到指定端口(port)
        ServerSocket serverSocket = serverSocketChannel.socket();
        serverSocket.bind(new InetSocketAddress(9090));
        /**
         * 將通道(Channel)注冊(cè)到通道管理器(Selector),并為該通道注冊(cè)selectionKey.OP_ACCEPT事件
         * 注冊(cè)該事件后,當(dāng)事件到達(dá)的時(shí)候,selector.select()會(huì)返回,
         * 如果事件沒(méi)有到達(dá)selector.select()會(huì)一直阻塞。
         */
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        // 循環(huán)處理
        while (true) {
            // 當(dāng)注冊(cè)事件到達(dá)時(shí),方法返回,否則該方法會(huì)一直阻塞
            selector.select();
            // 獲取監(jiān)聽(tīng)事件
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = selectionKeys.iterator();
            // 迭代處理
            while (iterator.hasNext()) {
                // 獲取事件
                SelectionKey key = iterator.next();
                // 移除事件,避免重復(fù)處理
                iterator.remove();
                // 檢查是否是一個(gè)就緒的可以被接受的客戶(hù)端請(qǐng)求連接
                if (key.isAcceptable()) {
                    handleAccept(key);
                } else if (key.isReadable()) {// 檢查套接字是否已經(jīng)準(zhǔn)備好讀數(shù)據(jù)
                    handleRead(key);
                }
            }
        }
    }
    /**
     * 處理客戶(hù)端連接成功事件
     */
    private static void handleAccept(SelectionKey key) throws IOException {
        // 獲取客戶(hù)端連接通道
        ServerSocketChannel server = (ServerSocketChannel) key.channel();
        SocketChannel socketChannel = server.accept();
        socketChannel.configureBlocking(false);
        // 信息通過(guò)通道發(fā)送給客戶(hù)端
        String msg = "Hello Client!";
        socketChannel.write(ByteBuffer.wrap(msg.getBytes()));
        // 給通道設(shè)置讀事件,客戶(hù)端監(jiān)聽(tīng)到讀事件后,進(jìn)行讀取操作
        socketChannel.register(selector, SelectionKey.OP_READ);
    }
    /**
     * 監(jiān)聽(tīng)到讀事件,讀取客戶(hù)端發(fā)送過(guò)來(lái)的消息
     */
    private static void handleRead(SelectionKey key) throws IOException {
        SocketChannel channel = (SocketChannel) key.channel();
        // 從通道讀取數(shù)據(jù)到緩沖區(qū)
        ByteBuffer buffer = ByteBuffer.allocate(128);
        channel.read(buffer);
        // 輸出客戶(hù)端發(fā)送過(guò)來(lái)的消息
        byte[] data = buffer.array();
        String msg = new String(data).trim();
        System.out.println("server received msg from client:" + msg);
    }
}

有服務(wù)端的代碼可以知道:首先我們將 select 打開(kāi),然后創(chuàng)建通道、將通道設(shè)置為非阻塞、創(chuàng)建連接、完成注冊(cè) 等待監(jiān)聽(tīng)、處理事件,詳細(xì)的每一行代碼的意思,都已經(jīng)進(jìn)展標(biāo)注??创a即可。

優(yōu)點(diǎn)及缺點(diǎn)

優(yōu)點(diǎn):可靠性高,吞吐量比較高、非阻塞

缺點(diǎn):編程模型做復(fù)雜

適用場(chǎng)景

適用于連接比較多且連接比較短的場(chǎng)景。

比如聊天室!

到此這篇關(guān)于Java中的同步非阻塞IO模型詳解的文章就介紹到這了,更多相關(guān)同步非阻塞IO模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • eclipse下搭建hibernate5.0環(huán)境的步驟(圖文)

    eclipse下搭建hibernate5.0環(huán)境的步驟(圖文)

    這篇文章主要介紹了eclipse下搭建hibernate5.0環(huán)境的步驟(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Java?如何用二維數(shù)組創(chuàng)建空心菱形

    Java?如何用二維數(shù)組創(chuàng)建空心菱形

    這篇文章主要介紹了Java?如何用二維數(shù)組創(chuàng)建空心菱形,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot整合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能

    SpringBoot整合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能

    在當(dāng)今互聯(lián)網(wǎng)時(shí)代,實(shí)時(shí)通信已經(jīng)成為了許多應(yīng)用程序的基本需求,而WebSocket作為一種全雙工通信協(xié)議,為開(kāi)發(fā)者提供了一種簡(jiǎn)單、高效的實(shí)時(shí)通信解決方案,本文將介紹如何使用SpringBoot框架來(lái)實(shí)現(xiàn)WebSocket的集成,快速搭建實(shí)時(shí)通信功能,感興趣的朋友可以參考下
    2023-11-11
  • springboot使用redis注解做緩存的基本操作方式

    springboot使用redis注解做緩存的基本操作方式

    這篇文章主要介紹了springboot使用redis注解做緩存的基本用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java idea如何根據(jù)請(qǐng)求路徑url自動(dòng)找到對(duì)應(yīng)controller方法插件

    java idea如何根據(jù)請(qǐng)求路徑url自動(dòng)找到對(duì)應(yīng)controller方法插件

    這篇文章主要介紹了java idea如何根據(jù)請(qǐng)求路徑url自動(dòng)找到對(duì)應(yīng)controller方法插件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 深入淺出Java 抽象類(lèi)與接口及區(qū)別對(duì)比分析

    深入淺出Java 抽象類(lèi)與接口及區(qū)別對(duì)比分析

    抽象類(lèi)和接口是Java中實(shí)現(xiàn)多態(tài)和設(shè)計(jì)模式的重要工具,它們?cè)诰幊讨芯哂兄匾牡匚?能夠有效提高代碼的靈活性和可維護(hù)性,本文給大家介紹Java抽象類(lèi)與接口及區(qū)別對(duì)比分析,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • 詳解Alibaba?Java診斷工具Arthas查看Dubbo動(dòng)態(tài)代理類(lèi)

    詳解Alibaba?Java診斷工具Arthas查看Dubbo動(dòng)態(tài)代理類(lèi)

    這篇文章主要介紹了Alibaba?Java診斷工具Arthas查看Dubbo動(dòng)態(tài)代理類(lèi)?,它可以幫助我們查看JDK或者javassist生成的動(dòng)態(tài)代理類(lèi),當(dāng)然,它的功能遠(yuǎn)不止此,還可以在生產(chǎn)環(huán)境進(jìn)行診斷,需要的朋友可以參考下
    2022-04-04
  • Spring鉤子接口匯總分析使用示例

    Spring鉤子接口匯總分析使用示例

    Spring提供了非常多的擴(kuò)展接口,官方將這些接口稱(chēng)之為鉤子,這些鉤子會(huì)在特定的時(shí)間被回調(diào),以此來(lái)增強(qiáng)Spring功能,眾多優(yōu)秀的框架也是通過(guò)擴(kuò)展這些接口,來(lái)實(shí)現(xiàn)自身特定的功能,如SpringBoot、mybatis等
    2023-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)二維數(shù)組與稀疏數(shù)組轉(zhuǎn)換詳解

    Java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)二維數(shù)組與稀疏數(shù)組轉(zhuǎn)換詳解

    稀疏數(shù)組是用于優(yōu)化,壓縮具有以下特點(diǎn)的二維數(shù)組:當(dāng)二維數(shù)組中的元素大部分相同,有意義的數(shù)據(jù)元素較少時(shí),可以使用稀疏數(shù)組進(jìn)行簡(jiǎn)化,節(jié)省存儲(chǔ)空間
    2021-10-10
  • JavaScript Date時(shí)間對(duì)象的常用操作方法總結(jié)

    JavaScript Date時(shí)間對(duì)象的常用操作方法總結(jié)

    本文介紹了JavaScript中Date對(duì)象的常用操作方法,包括創(chuàng)建、獲取、設(shè)置本地及UTC時(shí)間等,幫助開(kāi)發(fā)者靈活處理日期與時(shí)間的相關(guān)需求,需要的朋友可以參考下
    2025-10-10

最新評(píng)論

和平区| 通州区| 乌苏市| 凌云县| 珲春市| 周至县| 台湾省| 奉贤区| 安远县| 永丰县| 固镇县| 望江县| 墨竹工卡县| 霍林郭勒市| 拜泉县| 诏安县| 彭泽县| 肃宁县| 伊宁市| 资中县| 德清县| 大兴区| 洮南市| 巴南区| 睢宁县| 新田县| 融水| 蒲江县| 贡嘎县| 湖南省| 安陆市| 浮山县| 木里| 陇西县| 武夷山市| 诸城市| 肥城市| 工布江达县| 岚皋县| 临潭县| 临清市|