Java ThreadPoolExecutor getTaskCount() Method

The ThreadPoolExecutor class in Java provides the getTaskCount() method to get the total number of tasks that have been scheduled for execution. This guide will cover the usage of the getTaskCount() method, explain how it works, and provide concise examples to demonstrate its functionality in real-world use cases.

Introduction

The getTaskCount() method is used to retrieve the approximate total number of tasks that have been scheduled for execution. This includes both completed and currently executing tasks. This method is useful for monitoring the workload handled by the ThreadPoolExecutor.

getTaskCount Method Syntax

The syntax for the getTaskCount method is as follows:

public long getTaskCount()
  • The method does not take any parameters.
  • The method returns a long value representing the approximate total number of tasks scheduled for execution.

Examples

Example 1: Basic Usage of getTaskCount()

In this example, we create a ThreadPoolExecutor, submit multiple tasks, and use the getTaskCount() method to print the total number of tasks scheduled for execution.

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class GetTaskCountExample {
    public static void main(String[] args) {
        // Create a ThreadPoolExecutor with 2 threads
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);

        // Submit tasks to the executor
        for (int i = 0; i < 5; i++) {
            final int taskNumber = i + 1;
            executor.submit(() -> {
                System.out.println("Executing task " + taskNumber + " by " + Thread.currentThread().getName());
                try {
                    Thread.sleep(2000); // Simulate task execution
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Task " + taskNumber + " completed by " + Thread.currentThread().getName());
            });
        }

        // Print the total number of tasks scheduled for execution
        System.out.println("Total tasks scheduled: " + executor.getTaskCount());

        // Shutdown the executor
        executor.shutdown();
    }
}

Output:

Executing task 1 by pool-1-thread-1
Executing task 2 by pool-1-thread-2
Executing task 3 by pool-1-thread-1
Executing task 4 by pool-1-thread-2
Executing task 5 by pool-1-thread-1
Total tasks scheduled: 5
Task 1 completed by pool-1-thread-1
Task 2 completed by pool-1-thread-2
Task 3 completed by pool-1-thread-1
Task 4 completed by pool-1-thread-2
Task 5 completed by pool-1-thread-1

Example 2: Monitoring Task Count Dynamically

In this example, we dynamically monitor the total number of tasks scheduled for execution while submitting tasks to the ThreadPoolExecutor.

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class DynamicTaskCountExample {
    public static void main(String[] args) {
        // Create a ThreadPoolExecutor with 3 threads
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(3);

        // Submit tasks to the executor
        for (int i = 0; i < 10; i++) {
            final int taskNumber = i + 1;
            executor.submit(() -> {
                System.out.println("Executing task " + taskNumber + " by " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000); // Simulate task execution
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Task " + taskNumber + " completed by " + Thread.currentThread().getName());
            });

            // Print the total number of tasks scheduled for execution
            System.out.println("Total tasks scheduled: " + executor.getTaskCount());
        }

        // Shutdown the executor
        executor.shutdown();
    }
}

Output:

Executing task 1 by pool-1-thread-1
Total tasks scheduled: 1
Executing task 2 by pool-1-thread-2
Total tasks scheduled: 2
Executing task 3 by pool-1-thread-3
Total tasks scheduled: 3
Executing task 4 by pool-1-thread-1
Total tasks scheduled: 4
Executing task 5 by pool-1-thread-2
Total tasks scheduled: 5
Executing task 6 by pool-1-thread-3
Total tasks scheduled: 6
Executing task 7 by pool-1-thread-1
Total tasks scheduled: 7
Executing task 8 by pool-1-thread-2
Total tasks scheduled: 8
Executing task 9 by pool-1-thread-3
Total tasks scheduled: 9
Executing task 10 by pool-1-thread-1
Total tasks scheduled: 10
Task 1 completed by pool-1-thread-1
Task 2 completed by pool-1-thread-2
Task 3 completed by pool-1-thread-3
Task 4 completed by pool-1-thread-1
Task 5 completed by pool-1-thread-2
Task 6 completed by pool-1-thread-3
Task 7 completed by pool-1-thread-1
Task 8 completed by pool-1-thread-2
Task 9 completed by pool-1-thread-3
Task 10 completed by pool-1-thread-1

Example 3: Combining getTaskCount() with Other Monitoring Methods

In this example, we use the getTaskCount() method along with other monitoring methods like getActiveCount() and getCompletedTaskCount() to get a comprehensive view of the thread pool's state.

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class ComprehensiveMonitoringExample {
    public static void main(String[] args) {
        // Create a ThreadPoolExecutor with 4 threads
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);

        // Submit tasks to the executor
        for (int i = 0; i < 8; i++) {
            final int taskNumber = i + 1;
            executor.submit(() -> {
                System.out.println("Executing task " + taskNumber + " by " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1500); // Simulate task execution
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Task " + taskNumber + " completed by " + Thread.currentThread().getName());
            });
        }

        // Monitor the executor's state
        new Thread(() -> {
            while (!executor.isTerminated()) {
                System.out.println("Active threads: " + executor.getActiveCount());
                System.out.println("Total pool size: " + executor.getPoolSize());
                System.out.println("Tasks in queue: " + executor.getQueue().size());
                System.out.println("Total tasks scheduled: " + executor.getTaskCount());
                System.out.println("Completed tasks: " + executor.getCompletedTaskCount());
                try {
                    Thread.sleep(500); // Pause for a while before checking again
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // Shutdown the executor
        executor.shutdown();
    }
}

Output:

Executing task 1 by pool-1-thread-1
Executing task 2 by pool-1-thread-2
Executing task 3 by pool-1-thread-3
Executing task 4 by pool-1-thread-4
Executing task 5 by pool-1-thread-1
Executing task 6 by pool-1-thread-2
Executing task 7 by pool-1-thread-3
Executing task 8 by pool-1-thread-4
Active threads: 4
Total pool size: 4
Tasks in queue: 0
Total tasks scheduled: 8
Completed tasks: 0
Active threads: 4
Total pool size: 4
Tasks in queue: 0
Total tasks scheduled: 8
Completed tasks: 0
Task 1 completed by pool-1-thread-1
Task 2 completed by pool-1-thread-2
Task 3 completed by pool-1-thread-3
Task 4 completed by pool-1-thread-4
Active threads: 4
Total pool size: 4
Tasks in queue: 0
Total tasks scheduled: 8
Completed tasks: 4
Task 5 completed by pool-1-thread-1
Task 6 completed by pool-1-thread-2
Task 7 completed by pool-1-thread-3
Task 8 completed by pool-1-thread-4
Active threads: 0
Total pool size: 4
Tasks in queue: 0
Total tasks scheduled: 8
Completed tasks: 8

Conclusion

The ThreadPoolExecutor.getTaskCount() method in Java is used for retrieving the approximate total number of tasks that have been scheduled for execution in the thread pool. By using this method, along with other monitoring methods like getActiveCount() and getCompletedTaskCount(), you can gain valuable insights into the state and performance of your thread pool.

Comments