title: How do I run these two loops simultaneously? (Java)
body: <p>I'm trying to write a simple console program that allows me to send and receive String messages. The problem I am encountering though, is that I don't know how to run the receiving code and the sending code simultaneously.</p>
  
  <p>Individually, the classes are working. I can receive packets and send packets, but making them run at once seems impossible to me.</p>
  
  <p>I've looked into multi-threading but since my knowledge is still very basic, I can't seem to understand how it really works.</p>
  
  <p>This is the code I'm currently using. I wrote the Dialog class myself and found the other two classes on the internet.</p>
  
  <p>Dialog class:</p>
  
  <pre><code>import java.util.Scanner;
  
  
  public class Dialog {
  
  Scanner scanner = new Scanner(System.in);
  User user = new User();
  Network net = new Network();
  
  ThreadReceive tr = new ThreadReceive();
  ThreadSend ts = new ThreadSend();
  
  
  public void run() {
  
      System.out.println("WELCOME");
  
      System.out.print("Port: ");
      while(!user.setPort(giveInput())) {
          System.out.println("Enter a valid port.");
      }
  
      System.out.print("IP: ");
      user.setIP(giveInput());
  
      System.out.println();
      System.out.println("--- CONVERSATION STARTED ---");
  
      tr.receive(user.getIP(), user.getPort()); // Starts receiving loop (within ThreadReceive class).
  
      while (true) { // Starts sending loop.
          ts.sendMessage(giveInput(), user.getIP(), user.getPort()); // Sends packet when input is given.
      }
  
  }
  
  
  private String giveInput() {
  
      String input = scanner.nextLine();
      return input;
  
  }
  
  }
  </code></pre>
  
  <p>Receiving class:</p>
  
  <pre><code>import java.net.DatagramPacket;
  import java.net.DatagramSocket;
  import java.net.InetAddress;
  
  public class ThreadReceive extends Thread {
  
  public void receive(String ip, int port) {
  
      try {
  
          // Create a socket to listen on the port.
          DatagramSocket dsocket = new DatagramSocket(port);
  
          // Create a buffer to read datagrams into. If a
          // packet is larger than this buffer, the
          // excess will simply be discarded!
          byte[] buffer = new byte[2048];
  
          // Create a packet to receive data into the buffer
          DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
  
          // Now loop forever, waiting to receive packets and printing them.
          while (true) {
              // Wait to receive a datagram
              dsocket.receive(packet);
  
              // Convert the contents to a string, and display them
              String msg = new String(buffer, 0, packet.getLength());
              System.out.println(packet.getAddress().getHostName() + ": " + msg);
  
              // Reset the length of the packet before reusing it.
              packet.setLength(buffer.length);
          }
  
      }
  
      catch (Exception e) {
          System.err.println(e);
      }
  
  }
  
  }
  </code></pre>
  
  <p>Sending class:</p>
  
  <pre><code>import java.net.DatagramPacket;
  import java.net.DatagramSocket;
  import java.net.InetAddress;
  
  
  public class ThreadSend extends Thread {
  
  public void sendMessage(String message, String ip, int port) {
  
          try {
              byte[] data = message.getBytes();
  
              InetAddress address = InetAddress.getByName(ip);
  
              DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
  
              DatagramSocket datagramSocket = new DatagramSocket();
              datagramSocket.send(packet);
          } 
  
          catch (Exception e) {
              e.printStackTrace();
          }
      }
  
  }
  </code></pre>
  
  <p>Also, is there any way to test if I can receive packets? I've been testing it with a friend but it would be much more convenient to do it myself.</p>
  
  <p>Thanks!</p>