2017-11-13 7 views
-4

Java NIO가 상당히 복잡하다는 것을 알았습니다. Java NIO의 목적을 달성하는 Java IO에서 sth를 만들 수 있습니까?Java IO에서 Java NIO와 비슷한 sth를 빌드 할 수 있습니까?

Java NIO의 두 가지 주요 기능인 버퍼 지향 및 비 차단 IO를 쉽게 만들 수 있다고 생각합니다. 스트림의 데이터를 즉시 처리하는 대신 버퍼로 읽을 수있었습니다. 논 블로킹 입출력에 관해서는, Java IO의 setSoTimeout 메소드를 사용하여 스레드가 일정 시간 (예 : 100ms) 후에 대기를 포기할 수있게 할 수 있습니다.이 경우 다중 연결을 처리하는 스레드를 만들 수 있습니다.

위와 같이 쉬운 경우 Java NIO가 중복됩니까?

+0

아니요. 100mS와 0, 심지어 1mS와 0 사이에는 큰 차이가 있습니다. 읽기 타임 아웃으로'select()'를 효율적으로 구현할 수 없었다. – EJP

+2

좋아요, 포기 해요, "sth"무엇입니까? – azurefrog

+0

채널의 데이터를 사용할 수 있는지 Java NIO가 어떻게 식별하는지 궁금합니다. 일정 기간 동안 데이터를 기다리지 않습니까? –

답변

2

언뜻보기에 제안하는 솔루션이 제대로 작동하는 것처럼 보일 수 있습니다. 그러나 이는 단지 시뮬레이션 일 뿐이며 실제 NIO 구현만큼 효율적일 수는 없습니다.

NIO가 Java IO와 본질적으로 다른 점이 있습니다. 이 "고급"부분은 운영 체제에서의 지원이 필요합니다. 소량의 데이터로만 작업하는 경우 10ms는 60ms보다 많이 달라지지 않습니다. 그러나 다른 사람들이 말했듯이, 1 분 대신에 10 초가 걸리는 I/O는 다른 세계를 만듭니다.

다른 몇 가지 미묘한 점도 있습니다. 소켓 타임 아웃은 데이터를 기다리는 것과 같지 않습니다. 비동기 I/O는 많은 스레드를 필 요로 사용하지 않습니다. 일반적으로 하드웨어 장치 당 하나의 스레드로 충분합니다. 기다리는 일이 없습니다. 컨텍스트 스위치가 더 적습니다. 데이터는 가능하면 효율적으로 처리됩니다. 여기에는 피해야 할 버퍼를 다른 버퍼로 복사하지 않는 것이 포함됩니다. 결국 그것은 모두 합산됩니다.

+0

OS 지원에 대해 자세히 설명해 주시겠습니까? 그들은 무엇인가? –

+0

@PeterPhan 일반적인 입출력에서는 채널 당 스레드 수가 1 개인 것이므로 지연 시간을 최소화 할 수 있습니다. NIO를 사용하면 운영 체제에 소켓 목록을 제공하고 채널 중 하나가 데이터를 가질 때까지 기다립니다 ('select (2) 맨 페이지 참조). 그러면 모든 채널에있는 데이터의 양을 신속하게 쿼리 할 수 ​​있습니다. 데이터가있는 채널에서만 작동합니다. – Ferrybig

+0

Oh "select (2)"를 다시 누릅니다. 그것은 자바 메소드인가? Google을 검색했지만 관련성이 없습니다. –