자바

NIO TCP 비동기 채널의 특징, 비동기 채널 그룹

알통몬_ 2017. 4. 26. 10:11
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


NIO 는 TCP 블로킹과 넌블로킹 채널 말고도  TCP 비동기 채널을 제공합니다.

AnsynchronousServerSocketChannel,

AnsynchronousSocketChannel

위 두 채널은 각각 ServerSocketChannel, SocketChannel 에 대응됩니다.


비동기 채널 특징 :

accept()연결 요청, connect()연결 수락, read()읽기, write()쓰기를 호출하면 TCP 비동기 채널은 즉시 리턴합니다.

넌블로킹 방식과 동일하지만 차이점이 있습니다.

위 메소드들을 호출하면 스레드풀에게 작업 처리 요청을 하고 이 메소드들은 즉시 리턴되며

스레드풀의 작업 스레드가 실질적으로 작업을 처리한다는 것입니다.

작업 스레드가 작업을 완료하면 콜백 메소드가 자동 호출되기 때믄에 작업 완료 후에 실행해야 할 코드는

콜백 메소드에 작성하면 됩니다.


비동기 채널 그룹 :

같은 스레드풀을 공유하는 비동기 채널들의 묶음을 말합니다.

하나의 스레드풀을 사용한다고 하면 모든 비동기 채널은 같은 채널 그룹에 속해야 합니다.

비동기 채널을 생성할 때에 채널 그룹을 지정하지 않으면 기본 비동기 채널 그룹이 생성됩니다.

기본 비동기 채널 그룹은 내부적으로 스레드풀을 생성합니다.

ex)

new ThreadPoolExecutor(

     0, Integer.MAX_VALUE,

     Long.MAX_VALUE, TimeUnit.MILLISECONDS,

     new SynchronousQueue<Runnable>(),

     threadFactory); 


이론 상 Integer.MAX_VALUE 만큰 스레드의 수가 증가할 수 있지만 대부분은 최대 스레드 수를 지정해서

사용합니다.

SynchronousChannelGroup channelGroup = SynchronousChannelGroup.withFixedThreadPool(

   최대 스레드 수,

   Executor.defaultThreadFactory()

);

위 처럼 SynchronousChannelGroup 채널을 직접 생성 후 사용하는 것이 일반적입니다. 


CPU의 코어 수만큼 스레드를 관리하는 스레드풀을 생성하고 이것을 이용하는 비동기 채널 그룹을 생성하는 코드 

SynchronousChannelGroup channelGroup = SynchronousChannelGroup.withFixedThreadPool(

    Runtime.getRuntime().availableProcessors(),

    Executors.defaultThreadFactory()

);


생성된 비동기 채널 그룹은 비동기 채널을 생성할 때 매개 값으로 사용됩니다.

비동기 채널 그룹을 더 이상 사용하지 않고 종료할 때는 shutdown() 이나 shutdownNow()를 호출합니다.

channelGroup.shutdown();

 : 비동기 채널 그룹을 종료하겠다는 의사 전달만 할 뿐이고 즉시 비동기를 종료시키지 않고

비동기 채널 그룹에 포함된 모든 비동기 채널이 닫히고 나면 비동기 채널 그룹이 종료됩니다.

호출 후 새로운 비동기 채널을 그룹에 포함시킬 경우 ShutdownChannelGroupException이 발생합니다.

channelGroup.shutdownNow();

 : 강제적으로 비동기 채널 그룹에 포함된 모든 비동기 채널을 닫고 그룹을 종료합니다.

완료 콜백을 실행하고 있는 스레드는 종료되거나 인터럽트 되지 않습니다.


이상입니다.

다음 포스팅에서는 비동기 서버소켓 채널, 비동기 소켓 채널, 비동기 소켓 채널 데이터 통신에 대해

공부하겠습니다.


반응형