Sim, uso de IO nao bloqueante tende ser a mais performatico nesse tipo de aplicacao. Bem, o green thread eh exatamente isso, heheeh. O green thread, por implementar um escalonador proprio, era obrigado a traduzir todas as chamadas de IO do SO para modo nao bloqueante, senao ele nao atingiria seus objetivos (simular multithread). Se o green nao usasse io nao bloquante, no primeiro accept ou read que desse num socket, o SO jogaria o processo na fila de dormentes e soh iria voltar com a chegada do pacote de dados.
Era isso que eu adorava no green thread, voce via threads, mas por baixo era tudo feito por IO nao bloqueante.
Nao ha duvidas, que usar esses recursos diretamente eh extremamente poderoso (via java.nio). A biblioteca eh muito promissora e nao a duvida que um programa de CHAT teria muitos beneficios com o seu uso. Basta citar que o sistema de IRC, que muitos conhecem usa esse conceito, de io nao bloqueante e selects para monitorar os sockets.
Complementando um pouco o assunto, ouvi comentarios que a JVM JRockit, agora de propriedade da BEA, permite configurar quantas threads do SO voce quer utilizar, com isso e possivel startar a mesma quantidade de threads do SO quantas forem as CPU existentes. As demais threads serao entao escalonadas usando um sistema equivalente ao green thread em cima dessas threads da CPU. A vantagem disso eh menos carga ao SO, menos troca de contexto, visto que as threads do java nunca saem da CPU, a troca de contexto fica sendo feita em proprio espaco de usuario, sem recorrer a rotinas do SO. Afinal , eh isso que eu desejo de SO: que ele nao rode, que quem rode seja a minha aplicacao.