Cuando hablo de hilos no hablo de sockets. Una aplicación comun de comunicación con sockets es un chat por ejemplo, donde los clientes se conectan a un servidor, este registra la ip del cliente en un vector (o esctructura de almacenamiento) y asi para cada cliente. O sea cuando te llega una solicitud de un cliente a tu servidor no la procesas en el programa principal, sino que el socket que te llega lo mandas a otra funcion desde el programa principal, pero esa otra funcion es un hilo, algo asi como un 'subprograma' alterno que se ejecuta en 'paralelo' a la parte del servidor que se quedo esperando respuestas. Esto te va aa generar tantos hilos como clientes soliciten el servidor y el servidor no se va a bloquear con un cliente porque le deja el trabajo a los hilos. Los hilos en java se pueden manipular con a clase Thread del paquete java.lang o la interfaz Runnable, puedes buscar ayuda acerca de esas clases.
Hasta aqui espero no haberte confufido mucho más =(
Tus clientes necesitarían también trabajar con un hilo servidor para que puedan aceptar peticiones del servidor principal y otro hilo para trabajar como clientes en sí.
A nivel de sockets estás hablando de un nivel bajo de comunicación directamente con el protocolo TCP, hay muchas otras alternativas de más alto nivel, más fáciles pero requieren el uso de servicios que ya vienen con tu jdk, algunas de ellas son CORBA, RMI (100% java y má fácil que CORBA si trabajas solo Java) y Web Services (se supone que estos son de lo mejor, multiplataforma, basados en http y utilizando XML). Bueno, en el entorno de los sistemas distribuidos hay mucha información, sería bueno que pusieras en balance sobre que dispositivos necesitas trabajar, que cantidad de datos, la complejidad de los mismos y de las funciones e incluso cuestiones de seguridad, pues algunas alternativas son más baratas que otras en rendimiento, en velocidad, en seguridad, en complejidad, cosmopolitismo, etc, =)