Simple Program using Runnable and Callable
HelloThread1.java
public class HelloThread1 implements Runnable{ @Override public void run() { System.out.println("Hello World from Thread Name (" + Thread.currentThread().getName() +") using Runnable "); } }
HelloThread2.java
public class HelloThread2 implements Callable { @Override public Object call() throws Exception { return "Hello World from Thread Name (" + Thread.currentThread().getName() +") using Callable"; } }
Main.java
public class Main { public static void main(String[] args) throws Exception { HelloThread1 objThread1 = new HelloThread1(); //Instance of Runnable HelloThread2 objThread2 = new HelloThread2(); //Instance of Callable objThread1.run(); System.out.println(objThread2.call()); } }
Output
Hello World from Thread Name (main) using Runnable Hello World from Thread Name (main) using Callable
Simple Program to print numbers using threads
NumberPrinter.java
public class NumberPrinter implements Runnable{ int number; public NumberPrinter(int number){ this.number = number; } public void run(){ System.out.println("Printing Number from Thread "+ this.number); } }
Main.java
public class Main { public static void main(String[] args) { for (int idx=1;idx<=5;idx++){ Thread objthread = new Thread(new NumberPrinter(idx)); objthread.start(); } } }
Output
Printing Number from Thread 5 Printing Number from Thread 1 Printing Number from Thread 4 Printing Number from Thread 3 Printing Number from Thread 2
Simple Program using Executor Service taking Runnable as Argument
ExecutorService is a framework which allows to create thread. Threads can be created from FixedThreadPool, CachedThreadPool and ScheduledThreadPool. submit() method takes runnable or callable object (Functional Interface Type) as argument. The Same code above can be rewritten as below
Main.java
public class Main { public static void main(String[] args) throws Exception { ExecutorService objExecService = Executors.newFixedThreadPool(2); //Lambda Expresssion passed as Argument as Runnable is FI objExecService.submit(() -> { System.out.println(Thread.currentThread().getName()); }); objExecService.shutdown(); } }
Output
pool-1-thread-1
Same code with Runnable instance passed as argument to submit
. . //Instance of Runnable passed as argument HelloThread1 objHT1 = new HelloThread1(); objExecService.submit(objHT1); . .
Output
Hello World from Thread Name (pool-1-thread-1) using Runnable
Same code with Runnable as Anonymous Class passed as argument
ExecutorService exec = Executors.newFixedThreadPool(2); //Instance of Runnable passed as Anonymous class exec.execute(new Runnable() { public void run() { System.out.println("Hello world"); } }); exec.shutdown();
Simple Program using Executor Service taking Callable as Argument
public class Main { public static void main(String[] args) throws Exception { ExecutorService objExecService = Executors.newFixedThreadPool(2); Future<String> objFuture = objExecService.submit(new HelloThread2()); System.out.println(objFuture.get()); objExecService.shutdown(); } }
Output
Hello World from Thread Name (pool-1-thread-1) using Callable
Using Lambda Expression as Submi
. . ExecutorService objExecService = Executors.newFixedThreadPool(2); Future<String> objFuture = objExecService.submit(() -> { Thread.sleep(3000); return Thread.currentThread().getName(); }); System.out.println(objFuture.get()); . .
The above could be rewritten in anonymous class as below
ExecutorService objExecService = Executors.newFixedThreadPool(2); Future<String> objFuture = objExecService.submit(new Callable<String>() { @Override public String call() throws Exception { Thread.sleep(3000); return Thread.currentThread().getName(); } }); System.out.println(objFuture.get()); objExecService.shutdown();
Program for Creating Thread Pool and executing Task
ThreadPoolExample.java
public class ThreadPoolExample { public static void main(String args[]) { ExecutorService service = Executors.newFixedThreadPool(10); //create 10 worker threads in Thread Pool for (int i =0; i<100; i++){ service.submit(new Task(i)); //submit that to be done } service.shutdown(); } }
Task.java
final class Task implements Runnable { private int taskId; public Task(int id){ this.taskId = id; } @Override public void run() { System.out.println("Task ID : " + this.taskId +" performed by " + Thread.currentThread().getName()); } }
Task ID : 0 performed by pool-1-thread-1 Task ID : 3 performed by pool-1-thread-4 Task ID : 2 performed by pool-1-thread-3 Task ID : 1 performed by pool-1-thread-2 Task ID : 5 performed by pool-1-thread-6 Task ID : 4 performed by pool-1-thread-5