Metti il ciclo di accept in un altro thread che fa da Boss, in una configurazione Boss-Worker. I Worker sono i thread che si occupano delle connessioni, il Boss si occupa di fare l'accept e smistare il lavoro.
Un'altra soluzione (che puo' essere usata assieme a questa che ti ho detto) e' usare socket "non bloccanti". Invece di bloccare l'esecuzione sull'accept, fai un "polling" sul socket, chiedendo ad ogni ciclo se e' disponibile una connessione, se lo e' crei un thread, altrimenti ripeti il ciclo in una forma di questo tipo (pseudo codice):
Codice:
while (!QuitServer())
{
if (IsConnectionAvailable())
{
thread = CreateThread();
thread.HandleConnection();
}
ReleaseCPUToAnotherThread();
}
WaitForAllConnectionsToFinish();
IsConnectionAvailable() non e' bloccante e ritorna true se c'e' una connessione in ingresso, altrimenti ritorna subito false. Guarda la documentazione Java per usare socket non bloccanti.
La GUI puo' lanciare il thread del server e impostare una flag testata da QuitServer() quando il thread del server deve fermarsi.