Also optimieren im Sinne von Verbesserung der Performance kannst du glaube ich nicht mehr, aber ein paar Sachen lassen sich verschönern.

Die Streams würde ich nicht global definieren sondern im Konstruktor deiner Runnable-Klassen erzeugen. So ungefähr, ich habe das jetzt nicht getestet:

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Com
{
   public static Socket cs = null;
   
   public static void main(String args[])
   {
      try
      {
         cs = new Socket("localhost", 4003); 
         
         Thread t1 = new Thread(new Output( cs ));
         Thread t2 = new Thread(new Input( cs ));
         t1.start();
         t2.start();
      }
      
      catch(/*UnknownHostException is a*/ IOException e)
      {
         System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
         return;
      }
   }
}

class Input
extends Com
implements Runnable
{
   BufferedReader in = null;
   public Input( Socket cs ) {
         in = new BufferedReader(new InputStreamReader(cs.getInputStream()));
   }
   public void run()
   {
      try
      {
         while( true ) {
            System.out.println(in.readLine());
         }
      }
      
      catch (IOException e)
      {
         System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
         return;
      }
   }
}

class Output
extends Com
implements Runnable
{
   PrintStream out = null;
   BufferedReader reader = null;
   public Output( Socket cs ) {
         reader = new BufferedReader(new InputStreamReader(System.in));
         out = new PrintStream(cs.getOutputStream());
   }
   public void run()
   {
      try
      {
         while( true ) {
          out.print(reader.readLine());
         }
      }
      
      catch (IOException e)
      {
         System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
         return;
      }
   }
}

Gruß
Johannes

P.S. Das erneute Aufrufen von run() ist nicht gut, habs mal durch die while-schleife ersetzt. Sonst hast du Rekursion...