Thread class is having a join() method. Assume from thread ‘Thread1’ we are calling ‘Thread2.join()’. In this case the calling thread (‘Thread1’) is waiting to get the ‘Thread2’ to get completed and there after ‘Thread1’ resumes its execution.If we specify ‘Thread2.join(long interval)’ then the parameter interval is the maximum time by which the ‘Thread1’ can stay as blocked(Before coming back to runnable). The idea of join() will become clear once we discuss an example.
The join method in threading – Example
We have two threads .First thread is printing multiples of 10 from 0 to 100 and second thread is printing multiples of 10 from 100 to 200.We need to join second thread behind first thread so that multiples of 10 from 0 to 200 are printing.Now let us see the first thread.
public class FirstThread extends Thread {
int number = 0;
public FirstThread(String name) {
super(name);
}
public void run() {
while (number < 100) {
System.out.println("Number in " + Thread.currentThread().getName() + " is " + number);
try {
sleep(1000);
number = number + 10;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Now let us see the second thread. It contains a reference to the first thread.In the run method we are calling the join method.So it is not going to print any number till the end of execution of first thread.After the end of execution of first thread is over , second thread is starting to print its numbers.
public class SecondThread extends Thread {
int number = 100;
Thread firstThread = null;
public SecondThread(String name, Thread first) {
super(name);
firstThread = first;
}
public void run() {
try {
firstThread.join();
System.out.println("Joining second thread now");
while (number <= 200) {
System.out.println("Number in " + Thread.currentThread().getName() + " = " + number);
sleep(1000);
number = number + 10;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Now let us see the main class ,It simply creates objects of the above classes.Second thread is having a reference to the first thread so that it can call the join() on it. Remember , if we are using this method , we should handle the InterruptedException too.
public class Main {
public Main(){
}
public static void main(String[]args){
FirstThread firstThread = new FirstThread("firstThread");
SecondThread secondThread = new SecondThread("secondThread",firstThread);
firstThread.start();
secondThread.start();
}
}
Now let us verify the output.The output clearly shows us how join() works.Multiples of 10 from 0 to 100 is displaying first and then from 100 to 200.Thread name also displayed, so it is very clear now.
Output
Number in firstThread = 0
Number in firstThread = 10
Number in firstThread = 20
Number in firstThread = 30
Number in firstThread = 40
Number in firstThread = 50
Number in firstThread = 60
Number in firstThread = 70
Number in firstThread = 80
Number in firstThread = 90
Joining second thread now
Number in secondThread = 100
Number in secondThread = 110
Number in secondThread = 120
Number in secondThread = 130
Number in secondThread = 140
Number in secondThread = 150
Number in secondThread = 160
Number in secondThread = 170
Number in secondThread = 180
Number in secondThread = 190
Number in secondThread = 200