Problema de execução do thread

import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
import java.util.Scanner;

/**
 	-----------------------------------------------------------
	--           ARTIGO DE PROGRAMACAO MULTITHREAD           --
	-- APLICACAO MODELO                                      --
	-- AUTORES:    FERNANDO ORTEGA                           --
	--             GILBERTO MATIAS DE SOUZA                  --
	-- TURMA:      3ATI                                      --
	-- ANO:        2009                                      --
	-- PROFESSORA: JUSSARA                                   --
	-----------------------------------------------------------
	
	Essa aplicação visa demonstrar como um programa multithread funciona. 
	Permitindo a conexão de vários usuários ao mesmo tempo e processando
	individualmente cada aplicação
	
 */
public class AplicacaoMultithread {
	
	private static int totalClientes;
	
	
	/**
	 * Método de entrada da aplicação
	 * @param args
	 */
	public static void main(String[] args) {
		
		try{
			
			//Inicia o contador de clientes da aplicação
			AplicacaoMultithread.totalClientes = 0;
			
			//Cria um objeto para monitorar a porta 8080 da máquina
			ServerSocket server = new ServerSocket(8080);
			
			//Cria um laço infinito para receber as requisições de conexão com a aplicação
			while(true){
				
				System.out.println("Aguardando uma conexão de cliente:");
				System.out.println("Número de conexão já recebidas:" +totalClientes );
				
				//Aguarda uma conexão de um usuário
				Socket socket = server.accept(); 
			
				//Cria uma instancia do objeto que irá tratar a requisição
				ProcesssRequisicao processsRequisicao = new ProcesssRequisicao(socket);
				
				//Cria um novo thread para separar o fluxo de execução principal do fluxo de execução 
				//do tratamento da requisição do usuário. Desse modo a aplicação estará pronta para
				//receber novas conexões de outros usuários enquanto a conexão atual é tratada por um outro thread
				Thread thread = new Thread(processsRequisicao);
				
				//Inicia o fluxo para tratar a requisição
				thread.start();
			}
			
		}catch (Throwable e) {
			e.printStackTrace();
		}
	}

	
	public static class ProcesssRequisicao implements Runnable{
		
		private Socket socket;
		private int numero;
		
		public ProcesssRequisicao(Socket socket){
			this.socket = socket;
			this.numero = (totalClientes = totalClientes +1);
		}
		
		public void run() {
			try{
				
				//Pega o stream de retorno
				OutputStream ou = socket.getOutputStream();
				
				PrintStream out = new PrintStream(ou);
				
				//Pega o stream de entrada
				InputStream in = socket.getInputStream();
				
				//Cria um scanner para facilitar trabalhar com o objeto de entrada
				Scanner read = new Scanner(in);
				
				out.println("-----------------------------------------------------------");
				out.println("-- TABUADA SERVER  *********************  TABUADA SERVER --");
				out.println("--                                                       --");
				out.println("--           ARTIGO DE PROGRAMACAO MULTITHREAD           --");
				out.println("-- APLICACAO MODELO                                      --");
				out.println("-- AUTORES:    FERNANDO ORTEGA                           --");
				out.println("--             GILBERTO MATIAS DE SOUZA                  --");
				out.println("-- TURMA:      3ATI                                      --");
				out.println("-- ANO:        2009                                      --");
				out.println("-- PROFESSORA: JUSSARA                                   --");
				out.println("-----------------------------------------------------------");
				out.println();
				out.println();
				out.println("Cliente: " + this.numero + "");
				out.println();
				out.println();
				out.println("Qual o seu nome?: ");
				
				//Pega o nome do usuário
				String nome = read.nextLine();
				
				boolean repetir = false;
				
				out.println();
				out.println("Ola "+nome+", bem vindo ao TabuadaServer");
				out.println();
				out.println();
				out.println("Gostaria de participar de um jogo de Matematica?");
				out.println("S(sim)/N(nao): ");
				do {
					
					String resp = read.nextLine().toUpperCase();
					
					if(resp.equals("S")){
						
						Random rnd = new Random();
						
						int a = rnd.nextInt(11);
						int b = rnd.nextInt(11);
						int result = a * b;
						
						out.println(a + " x " + b + " = ");
						
						resp = read.nextLine();

						out.println();
						out.println();
						if(String.valueOf(result).equals(resp)){
							out.println("Parabens, voce acertou.");
						}else{
							out.println("Lamento, voce errou.");
							out.println();
							out.println("A resposta certa seria: " + result);
						}
						
						
						repetir = true;
						out.println();
						out.println();
						out.println("Deseja jogar novamente?");
						out.println("S(sim)/N(nao): ");
					}else if(resp.equals("N")){
						repetir = false;
					}else{
						repetir = true;
						out.println("S(sim)/N(nao):");
					}
					
				} while (repetir);
				
				
				out.println("Ate a proxima");
				
				
				
				socket.close();
			}catch (Throwable e) {
				e.printStackTrace();
			}
		}
		
	}
	
}

Qual o problema que vc está tendo?