내 응용 프로그램의 다른 쪽에서 외부 시스템과 연결되어 등록 된 클라이언트를 나타 내기 위해 클래스의 객체를 인스턴스화하는 Java 응용 프로그램을 작성하고 있습니다.자바 - 논 블로킹 소켓 용 다중 스레드의 다중 선택자
각 클라이언트 개체에는 프런트 엔드와 백 엔드를 나타내는 두 개의 중첩 된 클래스가 있습니다. 프론트 엔드 클래스는 실제 클라이언트로부터 계속해서 데이터를 수신하고 프런트 엔드에서 해당 데이터를 가져 와서 적절한 형식 및 프로토콜을 사용하여 외부 시스템으로 전송하는 백엔드 클래스에 표시 및 데이터를 보냅니다. 해당 시스템에 필요합니다.
디자인에서는 클라이언트 객체의 각 인스턴스화를 스레드로 만들려고합니다. 그런 다음, 각 스레드 내에서 당연히 프론트 엔드와 백엔드에 각각 하나의 클라이언트 측, 하나의 시스템 측에 각각 고유 한 NIO 채널 [편집]이있는 두 개의 소켓 [EDIT]이됩니다. 그러나 이제 비 블로킹 소켓이 필요합니다. 필자는 here 튜토리얼을 읽고 있는데, 주 스레드에서 Selector를 사용하여 안전하게 모든 연결 스레드를 처리하는 방법을 설명합니다.
하지만 필자가 필요로하는 것은 다중 선택기 (각 선택기는 자체 스레드에서 작동)입니다. 앞에서 설명한 튜토리얼을 읽으면서 Selector의 키 세트가 threadsafe가 아니라는 것을 알게되었습니다. 이것은 각각 소켓과 채널 쌍을 제공하려고 시도 할 때 각각의 repsective 스레드에서 인스턴스화 된 개별 Selector가 충돌하는 키를 생성 할 수 있다는 것을 의미합니까? 셀렉터를 주 스레드로 옮기는 것은 약간의 가능성이 있지만, 필자가 제공 한 소프트웨어 요구 사항에 따라 이상적인 것은 아닙니다. 도와 줘서 고마워.
나는 당신의 대답에 약간 혼란 스럽다. 채널 자체가 스레드인지, 채널이 자체 스레드인지 또는 별도의 채널을 설정하고 폴링해야한다고 말하고 있습니까? thread from the clients? 각 클라이언트 객체에는 두 개의 소켓과 응용 프로그램의 양쪽에서 통신하는 두 개의 채널이있을 것입니다. 원래 C에서 소켓을 작성하는 방법을 배우면서 비 블로킹 대 비 블로킹이라는 개념에 익숙하며 멀티플렉싱 된 통신에 대한 요구 때문에 비 블로킹을 특별히 선택했습니다. –
이것은 조심성이 있습니다. 제발, 다운 득표 없음 ... 시스템 쟁점 토론을 참조하십시오. : http://www.ibm.com/developerworks/aix/library/au-pollset/index.html 더 나은 대답을 제공합니다. 스레딩 thingamabob : 좋은 io와 스레딩 성능을 원하는 프로그래밍 컨텍스트에서 작동하도록 설계되었습니다. 전체 문제는 Real-Time JSR에 설명 된 문제로 심하게 흐려집니다. 위 링크를 통해 문제에 대한 정보를 얻은 엔지니어가 문제에 대한 토론을 할 수 있습니다. 나는 초기 테스트를 해봤 다. –