Ciao,
Premetto che di java ne capisco poco, comunque credo che dovresti separare la parte della GUI dalla logica che sta dietro alla comunicazione client-server.
Se LudecaLogInServer(socket); crea anche il JPanel mi pare ovvio che questo viene creato di continuo ad ogni nuovo thread

Schematicamente dovrebbe essere (prendilo per pseudocodice ):
codice:
 class LudecaGUIServer();               //Runnable, gestisce solo la gui
 class LudecaThreadServer(socket);  //Runnable, gestisce la comunicazione con il client


  class LudecaLogInServerParallelMain() {
   
   public void main(){
       LudecaGUIServer gui = LudecaGUIServer();
       gui.run();
   
      while(true) {
          System.out.println("In attesa di chiamate dai Client... ");
          Socket socket = serverSocket.accept();
          System.out.println("Ho ricevuto una chiamata di apertura da:\n" +
          socket);
          LudecaThreadServer serverThread = new LudecaThreadServer(socket);
          serverThread.run();
      }
    }
  }
Chiaramente, lascio a te l'onere di gestire i thread e la loro comunicazione oltre alle risorse condivise (probabilmente i thread lavoreranno sulla stessa JTable)