What is Thread in Java ?
Thread in Java is an independent path of execution which is used to run two task in parallel. When two Threads run in parallel that is called multi-threading in Java. Java is multithreaded from the start and excellent support of Thread at language level e.g. java.lang.Thread class, synchronized keyword, volatile and final keyword makes writing concurrent programs easier in Java than any other programming language e.g. C++. Being multi-threaded is also a reason of Java's popularity and being number one programming language. On the other hand if your program divides a task between two threads it also brings lot of programming challenges and issues related to synchronization, deadlock, thread-safety and race conditions. In short answer of question What is Thread in Java can be given like "Thread is a class in Java but also a way to execute something in parallel independently in Java". Thread in Java requires a task which is executed by this thread independently and that task can be either Runnable or Callable which we will see in next section along with an example of How to use multiple Thread in Java.
What is Runnable in Java?
Runnable represent a task in Java which is executed by Thread. java.lang.Runnable is an interface and defines only one method called run(). When a Thread is started in Java by using Thread.start() method it calls run() method of Runnable task which was passed to Thread during creation. Code written inside run() method is executed by this newly created thread. Since start() method internally calls run() method its been a doubt among Java programmers that why not directly call the run() method.
This is also asked as what is difference between start() and run() method in Java. Well when you call Runnable interface run() method directly , no new Thread will be created and task defined inside run() method is executed by calling thread. There is another interface added in Java 1. 5 called Callable which can also be used in place of Runnable interface in Java.
The Callable provides additional functionality over Runnable in terms of returning result of computation. Since return type of run() method is void it can not return anything which is sometime necessary. On the other hand Callable interface defines call() method which has return type as Future which can be used to return result of computation from Thread in Java.
Thread Example in Java.
Here is a simple example of Thread in Java. In this Java program we create two Thread object and pass them two different Runnable instance which is implemented using Anonymous class in Java. We have also provided name to each thread as “Thread A” and “Thread B”, name is optional and if you don’t give name, Java will automatically provide default name for your Thread like “Thread 0” and “Thread 1”. When we start thread using start() method it calls run() method which has code for printing name of Thread two times for Thread A and three times for Thread B.
public class ThraedExample{
public static void main(String args[]){
//two threads in Java which runs in Parallel
Thread threadA = new Thread(new Runnable(){
public void run(){
for(int i =0; i<2; i++){
System.out.println("This is thread : " + Thread.currentThread().getName());
}
}
}, "Thread A");
//Runnable interface is implemented using Anonymous Class
Thread threadB = new Thread(new Runnable(){
public void run(){
for(int i =0; i<3; i++){
System.out.println("This is thread : " + Thread.currentThread().getName());
}
}
}, "Thread B");
//starting both Thread in Java
threadA.start(); //start will call run method in new thread
threadB.start();
}
}
Output
public static void main(String args[]){
//two threads in Java which runs in Parallel
Thread threadA = new Thread(new Runnable(){
public void run(){
for(int i =0; i<2; i++){
System.out.println("This is thread : " + Thread.currentThread().getName());
}
}
}, "Thread A");
//Runnable interface is implemented using Anonymous Class
Thread threadB = new Thread(new Runnable(){
public void run(){
for(int i =0; i<3; i++){
System.out.println("This is thread : " + Thread.currentThread().getName());
}
}
}, "Thread B");
//starting both Thread in Java
threadA.start(); //start will call run method in new thread
threadB.start();
}
}
Output
This is thread : Thread A
This is thread : Thread A
This is thread : Thread B
This is thread : Thread B
This is thread : Thread B
This is thread : Thread A
This is thread : Thread B
This is thread : Thread B
This is thread : Thread B