 <p>You can find the approximate number of active threads in the <code>ThreadPoolExecutor</code> by calling the <code>getActiveCount</code> method on it. However you shouldn't need to.</p> <p>From the <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool-int-" rel="nofollow">Java documentation for Executors.newFixedThreadPool</a></p> <blockquote> <p>Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue. At any point, at most nThreads threads will be active processing tasks. If additional tasks are submitted when all threads are active, they will wait in the queue until a thread is available. If any thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks. The threads in the pool will exist until it is explicitly shutdown.</p> </blockquote> <p>So you should be able to keep submitting tasks to the thread pool and they will be picked up and run as threads become available.</p> <p>I also note that you are wrapping your tasks in <code>Thread</code> objects before submitting them to the thread pool which is not necessary.</p>