> Java > java지도 시간 > 자바 NIO: I/O 모델

자바 NIO: I/O 모델

大家讲道理
풀어 주다: 2017-05-28 11:32:33
원래의
1299명이 탐색했습니다.

아마도 많은 친구들이 NIO를 배울 때 약간 어렵다고 느낄 것이고 NIO의 많은 개념은 명확하지 않습니다. Java NIOprogramming에 들어가기 전에 오늘 몇 가지 기본 지식인 I/Omodel에 대해 논의해 보겠습니다. 다음 기사에서는 동기화와 비동기의 개념으로 시작한 다음 차단과 비차단의 차이점을 설명하고 차단 IO와 비차단 IO의 차이점을 소개한 다음 동기 IO와 비동기 IO의 차이점을 소개하고 다음을 소개합니다. 5가지 IO 모델, 그리고 마지막으로 고성능 IO 디자인과 관련된 2가지 디자인 패턴(Reactor 및 Proactor)이 소개됩니다.

다음은 이 글의 목차 개요입니다.

1. 동기화란 무엇인가요? 비동기식이란 무엇입니까?

 2. 차단이란 무엇인가요? 논블로킹이란 무엇인가요?

  3. 블로킹IO란? 논블로킹 IO란 무엇입니까?

4. 동기식 IO란 무엇인가요? 비동기 IO란 무엇입니까?

  5. 5가지 IO 모델

  6. 2가지 고성능 IO 디자인 패턴

  혹시라도 실수가 있다면 양해해주시고 비판과 수정을 환영합니다.

1. 동기화란 무엇인가요? 비동기식이란 무엇입니까?

 동기화와 비동기화의 개념은 오래 전부터 존재해왔고, 인터넷에는 동기화와 비동기화에 대한 많은 의견이 있습니다. 다음은 개인적인 이해입니다.

동기화는 여러 작업 또는 이벤트가 발생하는 경우 이러한 작업 또는 이벤트를 하나씩 수행해야 하며 하나의 이벤트 또는 작업을 실행하면 전체 프로세스가 대기하게 된다는 것을 의미합니다.

비동기식이란 여러 작업이나 이벤트가 발생하는 경우 이러한 이벤트가 동시에 실행될 수 있으며 하나의 이벤트나 작업 실행으로 인해 전체 프로세스가 일시적으로 기다리지 않는다는 의미입니다.

 이것은 동기식과 비동기식입니다. 간단한 예를 들자면, 두 개의 하위 작업 A와 B를 포함하는 작업이 있는 경우입니다. 동기화를 위해 A가 실행 중일 때 B는 A가 완료될 때까지만 기다릴 수 있으며 그런 다음 B는 비동기식으로 실행할 수 있습니다. 동시에 실행되며 B는 A의 실행이 완료될 때까지 기다릴 필요가 없으므로 A의 실행으로 인해 전체 작업이 일시적으로 기다리지 않습니다.

 그래도 이해가 되지 않는다면 다음 두 가지 코드를 먼저 읽어보세요:




1

2

3

4

5

6

7

8

9

10

11

12

13

14


void fun1() {void fun1() {

       

  }

   

  void fun2() {

       

  }

   

  void function(){

      fun1();

🎜🎜 }🎜🎜<code class="java space"> 🎜🎜 void code> <code class="java plain">fun2() {🎜🎜 🎜🎜 }🎜🎜 🎜🎜 void code> function(){🎜🎜 fun1();🎜

      fun2()

      .....

      .....

  }


이 코드는 메소드 함수에서 fun1을 실행하면 후속 fun2를 실행할 수 없게 됩니다. Fun2는 실행되기 전에 fun1의 실행이 완료될 때까지 기다려야 합니다.

  그런 다음 다음 코드를 살펴보세요.




1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24


void fun1() {

     

}

 

void fun2() {

     

}

 

void function(){

    <a href="//m.sbmmt.com/wiki/165.html" target="_blank">new</a> Thread(){

        public void run() {

            fun1();

        }

    }.start();

     

    new Thread(){

        public void run() {

            fun2();

        }

    }.start();

 

    .....

    .....

}

2🎜

3🎜

4🎜

5🎜

6🎜

7🎜

8🎜

9🎜

10🎜

11🎜

12🎜

13🎜

14🎜

15🎜

16🎜

17🎜

18🎜

19🎜

20🎜

21🎜

22🎜

23🎜

24🎜

🎜🎜

void fun1() {🎜

🎜

}🎜

🎜

void fun2() {🎜

  🎜<p class="line number7 index6 alt2"><code class="java plain">}🎜

🎜

void function(){🎜

<a href="//m.sbmmt.com/wiki/165.html" target="_blank">새 항목</a> Thread(){🎜

공개 void run() {🎜

fun1();🎜

}🎜

}.start();🎜

🎜

새로운 Thread(){🎜

공개 void run() {🎜

                                                 >fun2();🎜

                                                                                          p class="line number20 index19 alt1"><code class="java space"> }.start();🎜

🎜

.....🎜

. ....🎜

}🎜


이 코드는 일반적인 비동기 코드입니다. fun1의 실행은 fun2의 실행에 영향을 주지 않으며 fun1과 fun2의 실행으로 인해 후속 실행 프로세스가 일시적으로 대기하지 않습니다.

 실제로 동기화와 비동기성은 매우 광범위한 개념입니다. 이벤트 발생이나 실행으로 인해 여러 작업과 이벤트가 발생할 때 전체 프로세스가 일시적으로 대기하게 되는지 여부에 중점을 둡니다. Java의 synchronized 키워드로 동기화와 비동기를 비유할 수 있다고 생각합니다. 여러 스레드가 동시에 변수에 액세스하는 경우 각 스레드의 변수 액세스는 이벤트입니다. 동기화를 위해서는 한 스레드가 변수에 액세스하는 과정에서 다른 스레드가 하나씩 변수에 액세스해야 합니다. 비동기식의 경우 여러 스레드가 변수에 하나씩 액세스할 필요가 없지만 동시에 액세스할 수 있습니다.

그러므로 저는 개인적으로 동기화와 비동기성을 여러 가지로 표현할 수 있다고 생각하는데, 기억해야 할 핵심은 여러 작업과 이벤트가 발생할 때, 이벤트의 발생이나 실행으로 인해 전체 프로세스가 일시적으로 대기하게 되는 것인지 여부입니다. 일반적으로 비동기는 멀티 스레딩을 통해 달성할 수 있지만 멀티 스레딩을 비동기와 동일시하지 마십시오. 비동기는 단지 매크로 패턴일 뿐이며 멀티 스레딩을 사용하여 비동기를 달성하는 것은 단지 수단일 뿐이며 비동기 구현도 달성할 수 있습니다. 다중 처리를 통해.

2. 차단이란 무엇입니까? 논블로킹이란 무엇인가요?

 동기식과 비동기식의 차이점은 앞서 소개했습니다. 이번 섹션에서는 차단과 비차단의 차이점을 살펴보겠습니다.

 블로킹은 이벤트나 작업이 실행될 때 요청 작업을 실행하지만 요청 작업에 필요한 조건이 충족되지 않기 때문에 조건이 충족될 때까지 대기한다는 의미입니다. 이벤트나 작업이 실행 중일 때 요청 작업에 필요한 조건이 충족되지 않으면 조건이 충족되지 않았음을 알리는 플래그 메시지가 즉시 반환되며 거기서 영원히 기다리지 않습니다. .

 이것이 차단과 비차단의 차이입니다. 즉, 차단과 비차단의 주요 차이점은 작업을 요청할 때 조건이 충족되지 않으면 영원히 기다리거나 플래그 메시지를 반환하는지 여부입니다.

 간단한 예를 들자면:

 파일의 내용을 읽고 싶은 경우, 현재 파일에 읽을 수 있는 내용이 없으면 동기화를 위해 파일에 읽을 수 있는 내용이 있을 때까지 기다리게 됩니다. Non-Blocking의 경우 파일에 읽을 내용이 없음을 알리기 위해 플래그 메시지가 직접 반환됩니다.

인터넷의 일부 친구들은 동기화와 비동기를 각각 차단 및 비차단과 동일시합니다. 사실 둘은 완전히 다른 개념입니다. 후속 IO 모델을 이해하려면 이 두 가지 개념 집합 간의 차이점을 이해하는 것이 매우 중요합니다.

 동기식 및 비동기식의 초점은 하나의 작업 실행으로 인해 여러 작업이 실행되는 동안 전체 프로세스가 일시적으로 대기하게 되는지 여부에 있습니다.

 요청 작업을 실행할 때 차단 및 비차단의 초점은 다음과 같습니다. 작업 조건이 충족되지 않으면 조건이 충족되지 않았음을 알리는 플래그 메시지가 반환됩니다.

  블로킹과 비블로킹의 이해는 스레드 블로킹에 비유하여 이해할 수 있습니다. 스레드가 요청 작업을 수행할 때 조건이 충족되지 않으면 차단됩니다. 즉, 조건이 충족될 때까지 기다립니다.

3. IO 차단이란 무엇인가요? 논블로킹 IO란 무엇입니까?

 Blocking IO와 Non-Blocking IO를 이해하기에 앞서 먼저 다음 특정 IO 연산 프로세스가 어떻게 수행되는지 살펴보겠습니다.

일반적으로 IO 작업에는 하드 디스크 읽기 및 쓰기, 소켓 읽기 및 쓰기, 주변 장치 읽기 및 쓰기가 포함됩니다.

사용자 스레드가 IO 요청 작업을 시작하면(이 문서에서는 읽기 요청 작업을 예로 들었습니다) 커널은 읽을 데이터가 준비되었는지 확인합니다. IO 차단의 경우 데이터가 준비되지 않은 경우 데이터가 준비될 때까지 기다리세요. 비차단 IO의 경우 데이터가 준비되지 않은 경우 현재 읽고 있는 데이터가 준비되지 않았음을 사용자 스레드에 알리는 플래그 메시지가 반환됩니다. 데이터가 준비되면 데이터가 사용자 스레드에 복사되어 전체 IO 읽기 요청 작업이 완료됩니다. 즉, 전체 IO 읽기 요청 작업에는 두 단계가 포함됩니다.

  1) 데이터가 준비되었는지 확인합니다.

 2) 데이터 복사(커널이 데이터를 사용자 스레드에 복사합니다).

  그러면 블로킹(blocking IO)과 비차단(non-blocking IO)의 차이점은 첫 번째 단계에서 데이터가 준비되지 않은 경우 데이터가 준비되었는지 확인하는 과정에서 항상 기다려야 하는지 여부입니다. 준비가 되었거나 플래그 정보를 직접 반환할 수 있습니다.

 Java의 기존 IO는 소켓을 통해 데이터를 읽는 등의 IO를 차단합니다. read() 메서드를 호출한 후 데이터가 준비되지 않은 경우 현재 스레드는 항상 읽기 메서드 호출에서 차단되고 그 때까지 반환되지 않습니다. 데이터가 있고 비차단 IO인 경우 데이터가 준비되지 않은 경우 read() 메서드는 항상 대기하는 대신 현재 스레드에 데이터가 준비되지 않았음을 알리는 플래그 메시지를 반환해야 합니다.

4. 동기식 IO란 무엇인가요? 비동기 IO란 무엇입니까?

   먼저 동기 IO와 비동기 IO의 정의를 살펴보겠습니다. "유닉스 네트워크 프로그래밍" 책에 나오는 동기 IO와 비동기 IO의 정의는 다음과 같습니다.

  동기 I/O 작업으로 인해 요청 프로세스가 발생합니다. 해당 I/O 작업이 완료될 때까지 차단됩니다.
 비동기 I/O 작업으로 인해 요청 프로세스가 차단되지는 않습니다.

  문자 그대로의 의미로 볼 수 있습니다. 동기 IO는 스레드가 요청하는 경우 IO 작업이 완료되기 전에 스레드가 차단됩니다.

비동기 IO는 스레드가 IO 작업을 요청하면 IO 작업으로 인해 요청 스레드가 차단되지 않음을 의미합니다.

 실제로 동기식 IO 및 비동기식 IO 모델은 사용자 스레드와 커널 간의 상호 작용을 목표로 합니다.

 동기식 IO의 경우: 사용자가 IO 요청 작업을 실행한 후 데이터가 준비되지 않은 경우 사용자 스레드 또는 커널에 의해 지속적으로 처리됩니다. 데이터가 준비되었는지 폴링하기 위해 데이터가 준비되면 커널에서 사용자 스레드로 데이터를 복사합니다.

비동기 IO: IO 요청 작업의 발행만 수행됩니다. 사용자 스레드이며 IO 작업의 두 단계는 커널에 의해 자동으로 완료된 다음 사용자에게 스레드 IO 작업이 완료되었음을 알리는 알림을 보냅니다. 즉, 비동기 IO에서는 사용자 스레드가 차단되지 않습니다.

 이것이 동기 IO와 비동기 IO의 주요 차이점입니다. 동기 IO와 비동기 IO의 주요 차이점은 데이터 복사 단계가 사용자 스레드 또는 커널에 의해 완료되는지 여부에 반영됩니다. 따라서 비동기 IO에는 운영 체제의 기본 지원이 있어야 합니다.

 동기식 IO와 비동기식 IO는 차단 IO 및 비차단 IO와는 다른 개념입니다.

 블로킹 IO와 비블로킹 IO는 사용자가 IO 작업을 요청할 때 데이터가 준비되지 않은 경우 데이터가 준비될 때까지 기다리는 경우 사용자 스레드가 여전히 플래그 메시지를 수신한다는 사실에 반영됩니다. 즉, Blocking IO와 Non-Blocking IO는 IO 작업의 첫 번째 단계에 반영되어 데이터 준비 여부를 확인할 때 처리됩니다.

5. 다섯 가지 IO 모델

"Unix 네트워크 프로그래밍"이라는 책에는 차단 IO, 비차단 IO, 다중화 IO, 신호 드라이버 IO 및 비동기 IO라는 다섯 가지 IO 모델이 언급되어 있습니다.

  이제 5가지 IO 모델의 유사점과 차이점을 소개하겠습니다.

1. 차단 IO 모델

 가장 전통적인 IO 모델, 즉 데이터를 읽고 쓰는 과정에서 차단이 발생합니다.

 사용자 스레드가 IO 요청을 발행하면 커널은 데이터가 준비되었는지 확인하고 그렇지 않은 경우 데이터가 준비될 때까지 기다리며 사용자 스레드는 차단된 상태에 있게 됩니다. 스레드가 CPU를 넘겨줍니다. 데이터가 준비되면 커널은 데이터를 사용자 스레드에 복사하고 결과를 사용자 스레드에 반환한 다음 사용자 스레드는 블록 상태를 해제합니다.

  IO 모델 차단의 일반적인 예는 다음과 같습니다.




1

1


data = socket.read();

🎜🎜

data = 소켓.read();🎜


데이터가 준비되지 않은 경우 읽기 방법에서 항상 차단됩니다.

2. 비차단 IO 모델

사용자 스레드가 읽기 작업을 시작하면 기다릴 필요가 없지만 즉시 결과를 얻습니다. 결과가 오류인 경우 데이터가 아직 준비되지 않았음을 알고 읽기 작업을 다시 보낼 수 있습니다. 커널의 데이터가 준비되고 사용자 스레드로부터 다시 요청이 수신되면 즉시 데이터를 사용자 스레드에 복사한 다음 반환합니다.

실제로 비차단 IO 모델에서 사용자 스레드는 커널 데이터가 준비되었는지 지속적으로 물어봐야 합니다. 이는 비차단 IO가 CPU를 넘겨주지 않고 항상 CPU를 점유한다는 의미입니다.

 일반적인 비차단 IO 모델은 일반적으로 다음과 같습니다.




테이블>


하지만 논블로킹 IO에는 매우 심각한 문제가 있습니다. while 루프에서는 커널 데이터가 준비되었는지 지속적으로 물어봐야 하므로 CPU 사용량이 매우 높아집니다. 일반적으로 이 방법을 사용하여 데이터를 읽는 경우는 거의 없습니다.

3. 다중화 IO 모델

  다중화 IO 모델은 현재 더 자주 사용되는 모델입니다. Java NIO는 실제로 다중화된 IO입니다.

다중화 IO 모델에는 여러 소켓의 상태를 지속적으로 폴링하는 스레드가 있습니다. 소켓에 실제로 읽기 및 쓰기 이벤트가 있는 경우에만 실제 IO 읽기 및 쓰기 작업이 실제로 호출됩니다. 다중화된 IO 모델에서는 하나의 스레드만 사용하여 여러 소켓을 관리할 수 있으므로 시스템은 새 프로세스나 스레드를 생성할 필요도 없고 이러한 스레드와 프로세스를 유지할 필요도 없으며 실제 소켓 읽기 및 프로세스가 있는 경우에만 가능합니다. 쓰기 이벤트 IO 리소스는 시간이 다 된 경우에만 사용되므로 리소스 사용량이 크게 줄어듭니다.

 Java NIO에서는 각 채널에 도착 이벤트가 있는지 query하는 데 selector.select()를 사용합니다. 이벤트가 없으면 항상 해당 위치에서 차단되므로 이 메서드를 사용하면 사용자 스레드가 중단됩니다. 막힌.

 혹시 몇몇 친구들은 멀티스레딩 + 블로킹 IO를 사용하면 비슷한 효과를 얻을 수 있다고 말할 수도 있지만, 멀티스레딩 + 블로킹 IO에서는 각 소켓이 하나의 스레드에 해당하므로 리소스 사용량이 많이 발생하며 특히 긴 연결의 경우 스레드 리소스가 해제되지 않습니다. 나중에 연결이 많으면 성능 병목 현상이 발생합니다.

 다중화 IO 모드에서는 하나의 스레드를 통해 여러 소켓을 관리할 수 있습니다. 소켓에 실제로 읽기 및 쓰기 이벤트가 있는 경우에만 실제 읽기 및 쓰기 작업에 리소스가 사용됩니다. 따라서 다중화된 IO는 연결 수가 많은 상황에 더 적합합니다.

  또한 다중화 IO가 비차단 IO 모델보다 효율적인 이유는 비차단 IO에서는 사용자 스레드를 통해 소켓 상태를 지속적으로 조회하는 반면 다중화 IO에서는 각 소켓 상태를 폴링하기 때문입니다. 소켓 상태는 커널에 의해 처리되며 이 효율성은 사용자 스레드의 효율성보다 훨씬 높습니다.

그러나 다중화 IO 모델은 폴링을 사용하여 이벤트 도착 여부를 감지하고 도착하는 이벤트에 하나씩 응답한다는 점에 유의해야 합니다. 따라서 다중화된 IO 모델의 경우 이벤트 응답 본문이 커지면 후속 이벤트가 오랫동안 처리되지 않고 새 이벤트 폴링이 영향을 받습니다.

4. 신호 구동 IO 모델

신호 구동 IO 모델에서는 사용자 스레드가 IO 요청 작업을 시작하면 해당 소켓에 신호 함수 가 등록되고 사용자 스레드는 계속해서 커널 데이터가 준비되면 실행합니다. 사용자 스레드가 신호를 받은 후 신호 함수에서 IO 읽기 및 쓰기 작업을 호출하여 실제 IO 요청 작업을 수행합니다.

5. 비동기 IO 모델

  비동기 IO 모델은 가장 이상적인 IO 모델입니다. 비동기 IO 모델에서는 사용자 스레드가 읽기 작업을 시작하면 즉시 다른 작업을 시작할 수 있습니다. 반면, 커널의 관점에서 보면 비동기 읽기를 수신하면 즉시 반환되어 읽기 요청이 성공적으로 시작되었음을 나타내므로 사용자 스레드에 대한 블록이 생성되지 않습니다. 그런 다음 커널은 데이터 준비가 완료될 때까지 기다린 다음 데이터를 사용자 스레드에 복사합니다. 이 모든 작업이 완료되면 커널은 읽기 작업이 완료되었음을 알리는 신호를 사용자 스레드에 보냅니다. 즉, 사용자 스레드는 전체 IO 작업이 실제로 어떻게 수행되는지 알 필요가 없으며 먼저 요청을 시작하면 커널에서 반환된 성공 신호를 받으면 IO 작업이 완료되었음을 의미합니다. 데이터를 직접 사용할 수 있습니다.

 즉, 비동기식 IO 모델에서는 IO 작업의 어느 단계도 사용자 스레드를 차단하지 않습니다. 두 단계 모두 커널에 의해 자동으로 완료된 다음 사용자 스레드에 작업이 완료되었음을 알리는 신호가 전송됩니다. 완전한. 특정 읽기 및 쓰기를 위해 사용자 스레드에서 IO 함수를 다시 호출할 필요가 없습니다. 이는 신호 기반 모델과 다릅니다. 신호 기반 모델에서는 사용자 스레드가 신호를 수신하면 데이터가 준비되었음을 나타내며 사용자 스레드는 실제 읽기를 수행하기 위해 IO 함수를 호출해야 합니다. 쓰기 작업; 비동기 IO 모델에서 신호를 수신하면 IO 작업이 완료되었음을 나타내며 실제 읽기 및 쓰기 작업을 위해 사용자 스레드에서 iO 함수를 호출할 필요가 없습니다.

비동기 IO에는 운영 체제의 기본 지원이 필요합니다. Java 7에서는 비동기 IO가 제공됩니다.

 처음 4개의 IO 모델은 실제로 동기식 IO이고 마지막 모델만 진정한 비동기식 IO입니다. 왜냐하면 다중화 IO이든 신호 구동 모델이든 IO 작업의 두 번째 단계에서 사용자 스레드가 차단되기 때문입니다. 즉, 커널에 의한 데이터 복사 프로세스가 사용자 스레드를 차단합니다.

6. 두 가지 고성능 IO 설계 패턴

  전통적인 네트워크 서비스 설계 패턴 중에는 두 가지 고전적인 패턴이 더 있습니다.

  하나는 멀티스레딩이고 다른 하나는 스레드 풀입니다.

 멀티 스레드 모드의 경우, 즉 클라이언트가 오면 서버는 아래 그림과 같이 클라이언트의 읽기 및 쓰기 이벤트를 처리하기 위해 새 스레드를 생성합니다.

이렇지만 모드는 서버로 인해 처리가 간단하고 편리합니다. 각 클라이언트 연결을 처리하는 데 스레드가 사용되므로 많은 리소스가 소모됩니다. 따라서 연결 수가 상한에 도달한 후 다른 사용자가 연결을 요청하게 되면 리소스 병목현상이 직접적으로 발생하게 되고, 심한 경우에는 서버가 다운되는 직접적인 원인이 될 수 있습니다.

따라서 one-thread-one-client 모델로 인해 발생하는 문제를 해결하기 위해 고정된 크기의 스레드 풀을 생성하고 클라이언트가 오면 스레드 풀 중 하나를 가져오는 스레드 풀 방식이 제안됩니다. 스레드 풀은 클라이언트가 읽기 및 쓰기 작업을 완료하면 스레드 점유를 넘겨주는 데 사용됩니다. 따라서 클라이언트별 스레드 생성으로 인한 리소스 낭비를 방지하여 스레드를 재사용할 수 있습니다.

그러나 스레드 풀에도 단점이 있습니다. 대부분의 연결이 긴 연결인 경우 스레드 풀의 모든 스레드가 일정 시간 동안 점유될 수 있습니다. 그런 다음 다른 사용자가 연결을 요청하면 문제가 발생할 수 있습니다. 사용 가능한 유휴 스레드가 없으면 클라이언트 연결이 실패하여 사용자 경험에 영향을 미칩니다. 따라서 스레드 풀은 다수의 짧은 연결 애플리케이션에 더 적합합니다.

따라서 Reactor와 Proactor라는 두 가지 고성능 IO 설계 패턴이 등장했습니다.

 리액터 모드에서는 각 클라이언트별로 관심 있는 이벤트를 먼저 등록한 후, 이벤트가 발생하면 스레드가 각 클라이언트를 폴링하여 이벤트가 모두 발생하면 순차적으로 처리됩니다. 처리되면 아래 그림과 같이 폴링을 계속하기 위해 전송됩니다.

여기에서 위의 5개 IO 모델의 다중화 IO가 Reactor 모드를 사용하는 것을 볼 수 있습니다. 위 그림에서는 각 이벤트가 순차적으로 처리되는 것을 보여주고 있습니다. 물론 이벤트 처리 속도를 높이기 위해 멀티 스레드나 스레드 풀을 통해 이벤트를 처리할 수도 있습니다.

 Proactor 모드에서는 이벤트가 감지되면 새로운 비동기 작업이 시작된 다음 처리를 위해 커널 스레드로 전달됩니다. 커널 스레드가 IO 작업을 완료하면 작업이 완료되었음을 알리는 알림이 전송됩니다. 비동기 IO 모델은 Proactor 모드를 사용한다는 것을 알 수 있습니다.

1

1

2

3

4

5

6

7


<a href="//m.sbmmt.com/wiki/121.html" target="_blank">while</a>(true){

    data = socket.read();

    <a href="//m.sbmmt.com/wiki/109.html" target="_blank">if</a>(data!= error){

        处理数据

        <a href="//m.sbmmt.com/wiki/130.html" target="_blank">break</a>;

    }

}

2🎜

3🎜

4🎜

5🎜

6🎜

7🎜

🎜🎜

<a href="//m.sbmmt.com/wiki%20/121.html" target="_blank">동안</a>(true){🎜

data = 소켓 .read( );🎜

<a href="http:%20//www%20.php.cn/wiki/109.html" target="_blank">if</a>(data!= error){🎜

데이터 처리🎜

<a href="//m.sbmmt.com/wiki/130.html" target="_blank"> break a></a>;🎜

}🎜

}🎜

위 내용은 자바 NIO: I/O 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿