How to use multithreading using java Exectuors

Create the following java file:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadingExecutor {

	public static void main(String[] argv){
		// Create the executor service with 3 Workers
		ExecutorService executor = Executors.newFixedThreadPool(3);

		String pattern = "yyyy-MM-dd hh:mm:ss aa";
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
		
		// Write the time in the logs 
		System.out.println( "Starting process at:\t" + simpleDateFormat.format( new Date() ) ); 		

		// Create all the workers and call the executor
        for (int i = 0; i < 5; i++) {
        	Runnable worker = new Worker(i);

        	executor.execute(worker);
        }

        // Call the shutdown method of the executor
        executor.shutdown();

        // Wait for the executors to be terminated
        while (!executor.isTerminated()) {
 			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
        }

		System.out.println( "Done processing at:\t" + simpleDateFormat.format( new Date() ) ); 		
     }
}

/**
 * Worker class implementing Runnable
 */
class Worker implements Runnable {
	// Internal Id of the Thread
	private int id;
	
	/**
	* Constructor with an id
	*/
	Worker(int id){
		this.id = id;
	}
	
	@Override
	public void run() {
		// Date pattern
		String pattern = "yyyy-MM-dd hh:mm:ss aa";
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

		System.out.println( "Starting Thread " + id + " at\t" + simpleDateFormat.format( new Date() ));

		// Call the process method
		process();
		
		System.out.println( "Thread " + id + " completed" + " at\t" + simpleDateFormat.format( new Date() ));
	}

   /**
	* Process method
	*/
	public void process(){
		
		// Wait for 2 seconds 
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

The output will be:

Starting process at:	2017-01-24 06:36:08 PM
Starting Thread 0 at	2017-01-24 06:36:08 PM
Starting Thread 1 at	2017-01-24 06:36:08 PM
Starting Thread 2 at	2017-01-24 06:36:08 PM
Thread 1 completed at	2017-01-24 06:36:10 PM
Thread 0 completed at	2017-01-24 06:36:10 PM
Thread 2 completed at	2017-01-24 06:36:10 PM
Starting Thread 4 at	2017-01-24 06:36:10 PM
Starting Thread 3 at	2017-01-24 06:36:10 PM
Thread 4 completed at	2017-01-24 06:36:12 PM
Thread 3 completed at	2017-01-24 06:36:12 PM
Done processing at:	2017-01-24 06:36:12 PM

The code first create a ExecutorService with 3 threads:

// Create the executor service with 3 Workers
ExecutorService executor = Executors.newFixedThreadPool(3);

Then 5 Workers, more than the ExecutorService can handle at once, are created and the executorService execute method is called with the worker:
// Create all the workers and call the executor
for (int i = 0; i < 5; i++) {
	Runnable worker = new Worker(i);

    executor.execute(worker);
}        

Once all the workers are added, the shutdown method is called then it waits for the isTerminated method to confirms that all the Workers have executed the methods.
// Call the shutdown method of the executor
executor.shutdown();

// Wait for the executors to be terminated
while (!executor.isTerminated()) {
	try {
		Thread.sleep(500);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

References:

java.util.concurrent.Executors

Recent Comments