title: Passing variable to Java Thread (run() method)
body: <p>I'm trying to pass the variable "name" from my main method to the run() method. </p>
  
  <p>I've tried this way <a href="https://stackoverflow.com/questions/4297261/how-can-i-pass-a-variable-into-a-new-runnable-declaration">how can I pass a variable into a new Runnable declaration?</a> </p>
  
  <p>But I couldn't get it to work. How can I pass that variable? (I've inserted the other class needed to run the program in full.)</p>
  
  <pre><code>import java.io.PrintWriter;
  import java.net.ServerSocket;
  import java.net.Socket;
  import java.util.Scanner;
  import java.net.InetAddress;
  import java.lang.management.ManagementFactory;
  import java.lang.management.RuntimeMXBean;
  
  
  
  public class Server {
  
      static Scanner input = new Scanner(System.in);
  
      public static void main(String[] args) {
  
          try {
              final int port = 8181;
              ServerSocket server = new ServerSocket(port);
              System.out.println("Server is up and running, waiting for clients to connect.");
  
              while (true) {
                  Socket sock = server.accept();
                  System.out.println("A new user has connected");
                  System.out.println("Type \"LIST\" to get a list of commands");
                  System.out.println("Enter your Username"); final String name = input.nextLine();
                  System.out.println("Now go to the client console to enter your messages");
                  new Thread(new Client(sock)).start();
              }
  
          } catch (Exception e) {
              System.out.println("An error occured.");
              e.printStackTrace();
          }
      }
  
      static class Client implements Runnable {
  
          private Socket socket;
          int id;
  
          public Client(Socket sock)
  
          {
              id = 1;
              socket = sock;
          }
  
          @Override
          public void run() {
  
              long jvmUpTime = ManagementFactory.getRuntimeMXBean().getUptime();
              RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean();
  
              try {
  
                  Scanner in = new Scanner(socket.getInputStream());
                  PrintWriter out = new PrintWriter(socket.getOutputStream());
  
                  while (true) {
  
                      String data = in.nextLine();
                      System.out.println("User : " + data);
  
                      if (data.startsWith("LEAVENOW")) {
                          System.out.println("Client has left the server");
                          break;
                      }
  
                      if (data.startsWith("GETIP")) {
                          // System.out.println("Client connected from " +
                          // InetAddress.getLocalHost());
                          System.out.println("Client connected from " + InetAddress.getLocalHost());
  
                      }
                      if (data.startsWith("SERVERTIME")) {
                          System.out.println(mxBean.getUptime());
  
                      }
                      /*
                       * if (data.startsWith("SETNAME")) {
                       * 
                       * Scanner input = new Scanner(System.in);
                       * 
                       * System.out.println("Enter your Username"); final String
                       * name = input.nextLine();
                       * System.out.println("Press 1 to confirm your user name");
                       * int namenum = input.nextInt(); if (namenum == 1){
                       * 
                       * System.out.println("name changed"); }
                       * 
                       * 
                       * }
                       */
                      if (data.startsWith("LIST")) {
                          System.out.println("Here is a list of commands that the user can use in the server");
                          System.out.println(
                                  "LEAVENOW = exit the server \nGETIP = Gets the IP address of the server \nSERVERTIME = The amount of milliseconds the server has been running \n ");
  
                      }
  
                      // send the line back to the client
                      // or whatever custom message we want
                      // out.println(line);
                      // out.flush();
  
                  }
  
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
  
      }
  
  }
  </code></pre>
  
  <p>The additional class to run the full program</p>
  
  <pre><code>import java.io.IOException;
  import java.io.PrintWriter;
  import java.net.Socket;
  import java.util.Scanner;
  
  public class ClientInstance {
      final static int port = 8181;
      final static String host = "localhost";
  
      /**
       * @param args
       *            the command line arguments
       */
      public static void main(String[] args) throws IOException {
  
          try {
  
              Socket sock = new Socket(host, port);
  
              System.out.println("You connected to " + host);
              System.out.println("Now enter your message ");
  
              new Thread(new ClientWriter(sock)).start();
              new Thread(new ClientReader(sock)).start();
  
          } catch (Exception CannotConnect) {
              System.err.println("Could not connect to the server please try again, if error proceeds restart IDE");
          }
      }
  
  
      static class ClientWriter implements Runnable {
  
          public Socket socket;
  
          public ClientWriter(Socket sock) {
              socket = sock;
          }
  
          public void run() {
              try {
                  Scanner chat = new Scanner(System.in);
                  PrintWriter out = new PrintWriter(socket.getOutputStream());
  
                  while (true) {
  
                      String input = chat.nextLine();
                      out.println(input);
                      out.flush();
  
                  }
  
              } catch (Exception e) {
                  e.printStackTrace();
  
              }
          }
  
  
      }
  
      static class ClientReader implements Runnable {
  
          public Socket socket;
  
          public ClientReader(Socket sock) {
              socket = sock;
          }
  
          public void run() {
              try {
                  /* Scanner scanner = new Scanner(socket.getInputStream());
                    //read data from client
                   while(true) {
                        String data = scanner.nextLine();
                        System.out.println("Received data! : " + data);
                    }
                    */
  
              } catch (Exception e) {
                  e.printStackTrace();
  
              }
          }
  
  
      }
  }
  </code></pre>
  
  <p>So with @Berger advice I changed my code and edited this part. All I did was add the string name as a parameter just like I did with socket sock. However when I call the name variable in my run() method the string just prints null.</p>
  
  <pre><code>new Thread(new Client(sock, name)).start();
              }
  
          } catch (Exception e) {
              System.out.println("An error occured.");
              e.printStackTrace();
          }
      }
  
      static class Client implements Runnable {
  
          private Socket socket;
          int id;
          String name;
  
          public Client(Socket sock, String name)
  
          {
              id = 1;
              socket = sock;
              name = name;
          }
  </code></pre>