Java의 비동기 IO?
java.nio 이외의 Java에는 비동기 io (소켓 기반)에 대한 어떤 옵션이 있습니까? 또한 java.nio는 백 라운드에서 스레드를 사용합니까 (내 생각에 .NET의 async-socket-library가 수행한다고 생각하는 것처럼, 아마도 변경되었을 수 있음) 아니면 적절한 선택 호출을 사용하여 "진정한"비동기 io입니까?
Java의 NIO 패키지 (Java6 기준)는 Selector 를 통해 비 차단 I / O 만 지원합니다 . Java7은 비동기 I / O 지원을 포함하는 NIO.2와 함께 제공되기를 바랍니다. 오늘날 가장 좋은 방법은 프레임 워크를 사용하는 것입니다. ARMistice가 Mina를 언급했습니다. 다음은 다른 것입니다.
- 그리즐리 . 이것은 Sun GlassFish 서버 의 I / O 코어입니다 . Grizzly는 비동기 읽기 / 쓰기를 수행하는 기능을 제공합니다 (큐 모델을 통해). TCP와 UDP를 모두 지원합니다. 저는 몇 가지 프로젝트에서 Grizzly를 사용했습니다. 프레임 워크에 대해 내가 좋아하고 싫어하는 것들이 있지만, 이것을 자세히 설명하는 것은 정말 또 다른 주제입니다. 나는 무언가를 시작하고 실행하는 것이 매우 쉬우 며 Grizzly가 당신을 위해 많은 무거운 작업을 수행한다고 말할 것입니다.
- Netty . 이 프로젝트는 Mina 프로젝트의 원저자 중 한 사람이 작성했습니다. 나는 이것을 사용하지 않았으므로 비동기 I / O에 대한 지원에 대해 알지 못합니다. 한 번보세요.
이제 스레드에 대한 질문과 관련하여 NIO 선택기는 비 블로킹 I / O에 스레드를 사용하지 않습니다. JDK6에서는 Windows 에서는 select () 를 사용 하고 최신 Linux 커널에서는 epoll 기능을 사용합니다. 비동기 I / O의 경우 스레딩 세부 정보는 프레임 워크에 따라 다릅니다.
JAVA 7이 도착 했으므로 새로운 답변은 Future 클래스의 NIO.2입니다. 예 :
서버 측 :
final AsynchronousServerSocketChannel serverSocket=
AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection
Future<AsynchronousSocketChannel> future= serverSocket.accept();
final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled()
//Do whatever you want ..
InputStream stream = Channels.newInputStream(clientSocket) (...)
클라이언트 측 :
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
Future connected = localSocket.connect(ourServerSocketAddress);
// later: if(future.isDone())
connected.get();
//Send something
OutputStream os = Channels.newOutputStream(clientChannel );
os.write (...)
업데이트 : 액터 모델을 사용할 수 있다면 AKKA TCP IO 가 더 좋을 것입니다.
libs와 관련된 또 다른 제안은 Naga ( http://naga.googlecode.com )입니다. 프레임 워크보다는 라이브러리와 비슷합니다. 그것이 당신의 차 한잔이라면 평범한 자바 소켓처럼 보이려고합니다. Grizzly, Mina 및 Netty에 비해 최소한입니다.
java.nio
단지 패키지 일뿐입니다. "멍청한"클래스 모음입니다. 그 자체로는 스레드를 사용하지 않습니다. Reactor 디자인 패턴 에서와 같이 적절하게 사용하면 적절하고 완전히 확장 가능한 비동기 I / O를 얻을 수 있습니다.
Network Stuff에 사용하는 데 관심이있는 경우. 정말 좋은 선택은 다음과 같습니다.
사용하기 쉽고 매우 강력합니다.
원래 질문에 대해 구현은 Unix / Linux 시스템의 AsynchronousFileChannel 한 경우에 I / O 작업 당 스레드 만 사용합니다.
참조 URL : https://stackoverflow.com/questions/592303/asynchronous-io-in-java
'Programing' 카테고리의 다른 글
Redux에서 상태를 업데이트 한 후 콜백을 트리거하는 방법은 무엇입니까? (0) | 2020.12.25 |
---|---|
데이터베이스를 문서화하는 방법 (0) | 2020.12.25 |
Visual Studio 2010을 VS2008과 나란히 설치하면 문제가 발생합니까? (0) | 2020.12.25 |
기본 네임 스페이스가 xmlns로 설정된 XML 소스가있는 XSLT (0) | 2020.12.25 |
그래프 데이터 구조 : DFS 대 BFS? (0) | 2020.12.25 |