2016-10-14 6 views
0

나는 클라이언트와의 모든 통신을 담당하는 단일 스레드를 갖는 것이 "좋은 디자인"이라고 종종 들었다.java-nio : 선택과 다른 스레드에서 보내기

그러나 클라이언트 요청을 처리하기 위해 다른 서버와 통신하는 스레드가 여러 개 있습니다.

현재 디자인은 선택 스레드에 보낼 응답을 대기열에 넣습니다. 그런 다음 선택 스레드는 응답을 대기열에서 제외하고 해당 클라이언트로 보냅니다.

이것은 바보입니다. 클라이언트에게 응답을 보낼 준비가 된 30 개의 스레드가 있고 모든 스레드가 대기열에 들어가고 하나를 선택하여 스레드를 하나씩 보내 게합니다.

닫힌 시스템을 가정하면이 제한을 무시하고 원래 클라이언트 요청을 수락 한 스레드와 (또는 같지 않더라도) 선택자가없는 스레드에서 보낼 방법이 없습니까? 그렇다면 어떻게? 폐쇄계 가정

+0

서버는 대개 각 클라이언트 자신의 스레드 내에서. 당신이 뭔가 다른 것을들은다면 나는 그것을 잘못한 소문으로 간주 할 것입니다. – Heri

+2

@Heri 소문이 아닙니다. 분명히 논 블로킹 (non-blocking) 멀티플렉싱 된 I/O는 결코 가열되지 않았습니다. 2002 년 약 1.4 버전의'java.nio' 패키지로 자바 1.4에 도입되었으며, 수십 년 전에 유닉스와 윈도우 및 다른 운영체제에 존재 해왔다. 여기에 잘못된 정보를 게시하지 마십시오. – EJP

답변

2

안전하게 이러한 제한

그러한 제한되지을 무시할 수있는 방법이 없다. 원하는 스레드에서 보낼 수 있습니다.

원래 클라이언트 요청을 수락 한 스레드와 (또는 같지 않더라도) 선택기가없는 스레드에서 보내면됩니까? 그렇다면 어떻게?

SocketChannel.write()으로 문의하십시오. 선택기 스레드에 쓰기를 대기열에 넣어야하는 유일한 경우는 짧은 길이 또는 길이가 0 인 쓰기가있는 경우입니다.이 경우 OP_WRITE, 대기열에 포함 된 데이터 등에 채널을 등록해야합니다.

관련 문제