In Java, a ServerSocket is the server end of a Socket connection that involves a client and a server. The client creates a Socket to the specified host, and the host running the ServerSocket generates that Socket with an accept() call in the ServerSocket class.
To accept clients, all you have to do is call ServerSocket.accept(), and when a client attempts to connect, you can accept that connection. However, if you have a very large server, a simple loop of the accept() call may not be enough to get all of your clients online fast enough, therefore, we must thread the accept() call.

Code:
import java.netSocket;
import java.net.ServerSocket;
import java.io.IOException;

public class Server {

	private final int LISTENER_THREADS = 5;

	public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(PORT);
			Acceptor acceptor = new Acceptor();
			for(int i = 0; i < LISTENER_THREADS; i++) {
				new Thread(acceptor).start();
			}
		} catch(IOException ioe) {
			ioe.printStackTrace();
		}
	}

	private class Acceptor implements Runnable {

		public void run() {
			try {
				Socket s = serverSocket.accept();
			} catch(IOException ioe) {
				ioe.printStackTrace();
			}
		}

	}

}
Using an inbound class object that implements the interface Runnable, we can create a thread from that object, and in the run() method, we will accept new Sockets from clients. Now, with the for loop, we will have 5 loops accepting connections instead of 1. I have made a variable that can be easily changed to change the amount of Socket acceptor threads that are running. The Acceptor class uses the ServerSocket variable in Server class named "serverSocket". If you do not wish to use inbound classes, you must use the constructor of the Acceptor class to pass along the ServerSocket variable.

Multi-threading is a powerful feature in the Java programming language, but threads are not easy on your computer, so I recommend you keep your thread count relatively low.