The Executor interface and the Executors Factory help you use ThreadPools.
In your case: You want to handle incoming client connection concurrently. So you need a Thread for each. So submitting a Task to an Executor is a convenient way to not be bothered with Thread creation etc.
So the line
Executor threadpool = Executors.newScheduledThreadPool(maxClients);
declares threadpool
to be an Executor ( that Tasks can be submitted to later on ) but you don't care which of the implementations. The right side of the "=" then uses the Factory to retrieve an instance of one of the implementations of Executor. In this case it is a ScheduledThreadPool
with at least maxClients
Threads waiting for new Tasks.
In the code it will probably used like
threadpool.execute( new ClientHandler(socket) );
where ClientHandler is some helperclass implementing Runnable, that handles IO with the Client.