IO NIO

1,Java NIO ?

Java non-blocking IO?即 非阻塞IO,線程在等待的時候,可以做其他的事情。

?

2,IO?對比NIO

IO?是面向流,NIO?是面向緩沖

面向流是指每次從流中讀出一個或者多個字節,直到全部讀出為止

面向緩沖區是指將數據先存到一個緩存區

?

IO 是阻塞, NIO 是非阻塞

IO:?當線程調用read() 或者write()?的時候,只有當數據被讀取或者完全寫入,否則該線程在此期間干不了其他事情。

NIO: 一個線程向通道發送請求讀取數據開始,直到數據變的可以讀取之前,線程不會阻塞,可以一直做其他事情。

?

3,IO 與 NIO 的選擇

每次發送少量數據,但是需要建立多個通道的情況,例如聊天室,這種情況適合用NIO

大量數據,少量連接,這種情況適合用IO

?

4,NIO有三個核心模塊:Selector(選擇器)、Channel(通道)、Buffer(緩沖區);

?

Buffer:與Channel 進行交互時,需要將數據從Channel 讀取到Buffer,從Buffer 寫入到Channel,緩沖區本質上是一塊可以存取數據的內存,只是被包裝成了NIO? Buffer 對象,提供一些方法,可以訪問。

緩沖區基本類型:ByteBuffer;CharBuffer;ShortBuffer;IntBuffer;LongBuffer;FloatBuffer;DoubleBuffer;

?

Channel: Channel好比IO 流的模擬,任何數據read() 或者write(),都必須通過Channel對象。

?

Selector:NIO 用select 機制,不用為每一個客戶端連接新的線程處理,而是將其注冊到Selector 對象中,這樣單線程利用Selector 對象管理大量的并發的網絡連接。

當有讀寫或時間發生時候,可以從Selector對象中獲得一個SelectorKey 通過這個SelectorKey 可以找到具體的Channel 來獲取從客戶端傳過來的數據。

通道和緩沖區的機制,使得線程無需阻塞地等待IO事件的就緒,但是總是要有人來監管這些IO事件。這個工作就交給了selector來完成,這就是所謂的同步。

要使用Selector,得向Selector注冊Channel,然后調用它的select()方法。這個方法會一直阻塞到某個注冊的通道有事件就緒,這就是所說的輪詢。一旦這個方法返回,線程就可以處理這些事件。

??? Selector中注冊的感興趣事件有:

  • OP_ACCEPT:即連接事件(TCP 連接), 對應于SelectionKey.OP_CONNECT;

  • OP_CONNECT :即確認事件, 對應于SelectionKey.OP_ACCEPT;

  • OP_READ :即讀事件, 對應于SelectionKey.OP_READ, 表示 buffer 可讀.

  • OP_WRITE:即寫事件, 對應于SelectionKey.OP_WRITE, 表示 buffer 可寫.

?

轉載于:https://www.cnblogs.com/pickKnow/p/9712062.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250587.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250587.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250587.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react --- 生命周期 給子組件傳遞數據

子組件 /src/components/LifeCycle.js import React, { Component } from reactexport class LifeCycle extends Component {constructor(props) {super(props);// 常用于初始化狀態(狀態初始化、屬性初始化)console.log("1.組件構建函數執行");}componentWillMoun…

Vue---mock.js 使用

mockjs 概述 在我們的生產實際中,后端的接口往往是較晚才會出來,并且還要寫接口文檔,于是我們的前端的許多開發都要等到接口給我們才能進行,這樣對于我們前端來說顯得十分的被動,于是有沒有可以制造假數據來模擬后端接…

Java 的抽象類

Java 的抽象類 用abstract關鍵字來修飾一個類時,這個類叫做抽象類;用abstract來修飾一個方法時,該方法叫做抽象方法。 抽象方法:只有方法的聲明,沒有方法的實現。以分號結束:abstract int abstractMethod…

react --- 按需加載組件

問題描述 使用 antd庫時使用按鈕,須導入如下 import Button from antd/lib/button import antd/dist/antd.css這樣會導入全局的樣式. 解決方案,配置按需加載 1.安裝 react-app-rewired取代 react-scripts, 可以擴展webapack 的配置, 類似vue.config.jsnpm install react-ap…

flask 實現異步非阻塞----gevent

我們都知道,flask不支持異步非阻塞的請求,我們可以創建一個新項目去測試一下,推薦大家使用pycharm去開發我們的flask 使用特別的方便。 rom flask import Flask import time app Flask(__name__) app.route(/) def hello_world():time.slee…

Axure下拉框級聯操作

現實生活中有很多的下拉框是級聯操作的,即因為第一個下拉框的選擇,影響到后面的下拉框的選擇的列表的數據。或許在代碼中,這些操作相對比較簡單,通過前一個下拉框的選擇項來控制后一個下拉框的數據的動態添加。那么,如…

react --- render持續調用解決方案

問題描述: 在某個組件中.有可能頻繁的取數據(但是數據未改變,因此不需要更新).數據的頻繁請求會觸發render函數,造成性能消耗模擬代碼如下 export class CommentList extends Component {constructor(props) {super(props);this.state {comments: []}}// 模擬頻繁的獲取新數…

Java 的工廠方法及代理模式

Java 的工廠方法及代理模式 工廠方法(FactoryMethod) 概述:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例化延遲到其子類。 適用性: 當一個類不知道它所必須創建的對象的類的時候當一個類希望由它的…

Linux 和 Vim 常用命令整理

Sftp常用命令: lcd f:本地切換到 F盤 lpwd本地 當前目錄 lls本地 文件列表 put 本地 上傳文件到服務器(put輸入后,回車會有彈窗,選擇上傳文件) get下載文件到本地 Linux命令: 1.文件夾的操作 1 pwd:顯示…

Socket網絡編程——C++實現

本代碼可直接使用 根據TCP/IP三次握手&#xff0c;實驗時可使用兩臺電腦&#xff0c;或者打開兩個終端模擬通信。 服務器端&#xff1a; #include <iostream> #include <windows.h>using namespace std;#pragma comment(lib,"ws2_32.lib") //引用靜態鏈接…

react --- 復合組件,傳遞屬性

組件復合 復合組件給予你足夠的靈活去定義組件的外觀和行為,而且是以一種明確和安全的方式進行.如果組件間有公用的非UI邏輯,將它們抽取為JS模塊導入使用而不是繼承它/src/components/Composition.js // Dialog作為容器不關心內容和邏輯 function Dialog(props){return <d…

6、復制文件

復制文件 要求&#xff1a; 1、將原文件xxx.txt中的內容復制到新的文件里 2、新文件的文件名為xxx&#xff08;復制&#xff09;.txt&#xff0c;即原文件名復制進行命名 大框架&#xff1a; 1、輸入想要復制的文件xxx.txt input() 2、創建一個文件xxx(復制).txt f1 open(&quo…

Java 的內部類

Java 的內部類 在Java中&#xff0c;允許一個類的定義位于另一個類的內部&#xff0c;前者稱為內部類&#xff0c;后者稱為外部類。Inner class一般用在定義它的類或語句塊之內&#xff0c;在外部引用它時必須給出完整的名稱。 Inner class的名字不能與包含它的類名相同&#…

html的基本結構

標記語言&#xff0c;就是有標簽結構的語言。 不管html文件有多復雜&#xff0c;它的基本結構 <元素 屬性屬性值 ... >內容</元素> 如果沒有內容&#xff0c;可以這樣寫。 元素也被叫做標記。 案例 <p>是段落標記 <font size"" color"&quo…

react --- Hook的使用

Hook 是React16.8一個新增項,它可以讓你在不編寫class的情況下使用state以及其他的React特性特點: 無需修改組件結構的情況下復用狀態邏輯將組件相互關聯的部分拆分成更小的函數,復雜組件將變得更容易理解更簡潔、更易理解的代碼 使用Hook的栗子 import React, { useState …

POJ 1811 Prime Test (Rabin-Miller強偽素數測試 和Pollard-rho 因數分解)

題目鏈接 Description Given a big integer number, you are required to find out whether its a prime number. Input The first line contains the number of test cases T (1 < T < 20 ), then the following T lines each contains an integer number N (2 < N &…

Windows忘記mysql的密碼

1、查看mysql的安裝路徑 show variables like "%char%"; 路徑&#xff1a;C:\Program Files\MySQL\MySQL Server 5.7\ 2、關閉mysql服務 我的電腦--管理--服務于應用程序--服務--mysql--右鍵--停止 4、開始修改密碼 1、打開dos窗口&#xff1a; widR 2.將目錄mysqld.…

Java 的單例模式

Java 的單例模式 單例模式(Singleton) 單例設計模式&#xff0c;就是采取一定的方法保證在整個的軟件系統中&#xff0c;對某個類只能存在一個對象實例&#xff0c;并且該類只提供一個取得其對象實例的方法。如果我們要讓類在一個虛擬機中只能產生一個對象&#xff0c;我們首…

react --- 隔代傳遞參數的三種方式

組件跨層級通信 - Context 上下文提供一種不需要每層設置props就能跨多級組件傳遞數據的方式 方式1 Provider提供值Consumer來消費傳遞的值 import React from react;// 創建一個上下文 const Mycontext React.createContext(); const { Provider, Consumer } MyContext;…

bzoj 4898: [Apio2017]商旅【Floyd+分數規劃+二分】

其實并不會分數規劃 因為要最大化 ans總收益/總路程 &#xff0c;所以考慮二分答案&#xff0c;找到一條 ans<總收益/總路程 的回路。先預處理出d(i,j)為(i,j)最短路&#xff0c;w(i,j)為在i買某個物品在j賣出的最大收益&#xff08;最小為0&#xff09;。把式子變一下&…