Problema com Performance em Chat com TCP

Estou com o seguinte problema, o código do servidor q postei e o do cliente funcionam. Mas fica extremamente lento, e quanto mas clientes entram uma nova thread é criada com um loop infinito verificando se chegou uma nova mensagem e encaminha para todos os outros clientes, e se houver mensagens após 10 segundos são apagadas.
Quem puder dar uma dica, como melhorar isto, ou uma nova ideia para refazer tudo de uma maneira melhor…

[code]public class Server {

public static void main (String [] args)
{
	try
	{
		ServerSocket servSock = new ServerSocket(3292);	
		
		ArrayList<Mensagem> mensagens = new ArrayList<Mensagem>();
		ThreadApagaMensagens a = new ThreadApagaMensagens(mensagens);
		a.start();
		
		while (true)
		{			
			Socket sock = servSock.accept();
		
			ThreadServidor t = new ThreadServidor(sock, mensagens);
			ThreadMensagens m = new ThreadMensagens(sock, mensagens);
			
			t.start();
			m.start();
		}
	}
	catch (Exception e)
	{
	}
	
}

}
class ThreadServidor extends Thread
{
private Socket sock;
ArrayList mensagens;
public ThreadServidor(Socket s, ArrayList m)
{
sock = s;
mensagens = m;
}
public void run()
{
try
{
InputStream entrada = sock.getInputStream();
DataInputStream entradaStr = new DataInputStream(entrada);
OutputStream saida = sock.getOutputStream();
DataOutputStream saidaStr = new DataOutputStream(saida);

		int opcao = entradaStr.readInt();
		
		LoginCadastro loginCadastro = new LoginCadastro(sock, mensagens);
		
		if(opcao == 0)
		{
			loginCadastro.Login();
		}
		else
		{
			loginCadastro.Cadastro();
		}
					
		//fecha a conexão
		sock.close();
	}
	catch(Exception e)
	{
	}		
}

}

class ThreadMensagens extends Thread
{
private Socket sock;
ArrayList mensagens;
int tam = 0;
public ThreadMensagens(Socket s, ArrayList m)
{
sock = s;
mensagens = m;
}
public void run()
{
while(true)
{
if(mensagens.size() > tam)
{
try
{
OutputStream saida = sock.getOutputStream();
DataOutputStream saidaStr = new DataOutputStream(saida);

				saidaStr.writeInt(1);
				String mensagem = mensagens.get(0).getLogin() +"#"+
				mensagens.get(0).getNick() +"#"+
				mensagens.get(0).getHora().getHora() +"#"+
				mensagens.get(0).getHora().getMin() +"#"+
				mensagens.get(0).getTexto();
				saidaStr.writeUTF(mensagem);
				System.out.println("Mensagem enviada: "+ mensagens.get(0).getTexto());
			}
			catch(Exception e)
			{
			}			
			tam++;
		}
		if(mensagens.size() < tam)
		{
			tam--;
		}
	}
}

}
class ThreadApagaMensagens extends Thread
{
ArrayList mensagens;
int tam = 0;
public ThreadApagaMensagens(ArrayList m)
{
mensagens = m;
}
public void run()
{
while(true)
{
if(mensagens.size() > 0)
{
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mensagens.remove(0);
}
}
}
}
[/code]

Já tentou fazer com JMS ?