I am confused when to use Thread.join()
and when to use synchronization
in multi threading application.
According to me, both of them block or wait for the execution to be done by some other thread.
This example has to output 10 A's , 10 B's & 10 C's in sequential pattern one after other like :
1 : A
2 : A
3 : A
4 : A
5 : A
6 : A
7 : A
8 : A
9 : A
10 : A
1 : B
2 : B
3 : B
4 : B
5 : B
6 : B
7 : B
8 : B
9 : B
10 : B
1 : C
2 : C
3 : C
4 : C
5 : C
6 : C
7 : C
8 : C
9 : C
10 : C
----ProGraM ENDS----
Example starts here
class SyncTest extends Thread
{
StringBuffer sb;
public SyncTest(StringBuffer sb)
{
this.sb = sb;
}
public void run()
{
synchronized(sb)
{
for(int i=1;i<=10;i++){
System.out.println(i+" : "+sb.charAt(0));
}
sb.setCharAt(0, (char) (sb.charAt(0)+1));
}
}
public static void main(String [] args) throws InterruptedException
{
StringBuffer sb = new StringBuffer("A");
Thread t1=new SyncTest(sb);
Thread t2=new SyncTest(sb);
Thread t3=new SyncTest(sb);
t1.start();
t2.start();
t3.start();
Thread.sleep(1000);
System.out.println("----ProGraM ENDS----");
}
}
Here, output turns out to be 10 A's followed by 10 B's followed by 10 C's in a sequential order. But I can also use Thread.join
instead of synchronized
block to get the same output like this:
public void run()
{
//removed synchronized statement...
for(int i=1;i<=10;i++){
System.out.println(i+" : "+sb.charAt(0));
}
sb.setCharAt(0, (char) (sb.charAt(0)+1));
}
public static void main(String [] args) throws InterruptedException
{
StringBuffer sb = new StringBuffer("A");
Thread t1=new SyncTest(sb);
Thread t2=new SyncTest(sb);
Thread t3=new SyncTest(sb);
t1.start();
t1.join();
t2.start(); // wait for t1 to complete
t2.join();
t3.start(); // wait for t2 to complete
t3.join();
// wait for t3 to complete
System.out.println("----ProGraM ENDS----");
}
Can anyone clear my confusion on usage of these 2 techniques i.e. when to use Thread.join
and when to use synchronization
in Multi-threading on Java.
Thread.join()
waits for the thread to completely finish, whereas a synchronized
block can be used to prevent two threads from executing the same piece of code at the same time.
It's hard to advise when to use one over the other in general, since they serve different purposes. It's rare to find an example, such as your code, where the difference between the two is minimal.
That being said, in your first example there is no guarantee the output will be alphabetical. You can't be sure which thread will get to the synchronized
block first. So in this particular case, join()
is most appropriate.