join()
is a instance method of java.lang.Thread class which we can use join() method
to ensure all threads that started from main must end in order in which they
started and also main should end in last. In other words waits for this thread
to die.
Exception:
join()
method throws InterruptedException.
Thread state:
When
join() method is called on thread it goes from running to waiting state. And
wait for thread to die.
synchronized
block:
Thread
need not to acquire object lock before calling join() method i.e. join() method
can be called from outside synchronized block.
Waiting time:
join():
Waits
for this thread to die.
public final void join() throws InterruptedException;
This
method internally calls join(0). And timeout of 0 means to wait forever;
join(long millis) – synchronized method
Waits
at most millis milliseconds for this thread to die. A timeout of 0 means to
wait forever.
public final synchronized void join(long millis)
throws
InterruptedException;
public final synchronized void join(long millis, int nanos)
throws InterruptedException;
Example of join
method
class MyThread implements Runnable {
public void run() {
String threadName = Thread.currentThread().getName();
Printer.print("run() method of "+threadName);
for(int i=0;i<4;i++){
Printer.print("i="+i+" ,Thread="+threadName);
}
}
}
public class TestJoin {
public static void
main(String...args) throws InterruptedException
{
Printer.print("start main()...");
MyThread runnable = new MyThread();
Thread thread1=new Thread(runnable);
Thread thread2=new Thread(runnable);
thread1.start();
thread1.join();
thread2.start();
thread2.join();
Printer.print("end main()");
}
}
class Printer {
public static void
print(String str) {
System.out.println(str);
}
}
Output:
start main()...
run() method of Thread-0
i=0 ,Thread=Thread-0
i=1 ,Thread=Thread-0
i=2 ,Thread=Thread-0
i=3 ,Thread=Thread-0
run() method of Thread-1
i=0 ,Thread=Thread-1
i=1 ,Thread=Thread-1
i=2 ,Thread=Thread-1
i=3 ,Thread=Thread-1
end main()
Note:
calling
thread1.join() made main thread to wait
until Thread-1 dies.
Let’s check a program
to use join(long millis)
First,
join(1000) will be called on Thread-1, but once 1000 millisec are up, main
thread can resume and start thread2 (main
thread won’t wait for Thread-1 to die).
class MyThread implements Runnable {
public void
run() {
String threadName = Thread.currentThread().getName();
Printer.print("run() method
of "+threadName);
for(int
i=0;i<4;i++){
try {
Thread.sleep(500);
} catch
(InterruptedException e) {
e.printStackTrace();
}
Printer.print("i="+i+"
,Thread="+threadName);
}
}
}
public class TestJoin {
public static void main(String...args) throws InterruptedException {
Printer.print("start
main()...");
MyThread runnable = new
MyThread();
Thread thread1=new
Thread(runnable);
Thread thread2=new
Thread(runnable);
thread1.start();
// once 1000 millisec are up,
// main thread can resume and start
thread2.
thread1.join(1000);
thread2.start();
thread2.join();
Printer.print("end
main()");
}
}
class Printer {
public static void print(String str) {
System.out.println(str);
}
}
Output:
start main()...
run() method of Thread-0
i=0 ,Thread=Thread-0
run() method of Thread-1
i=1 ,Thread=Thread-0
i=2 ,Thread=Thread-0
i=0 ,Thread=Thread-1
i=1 ,Thread=Thread-1
i=3 ,Thread=Thread-0
i=2 ,Thread=Thread-1
i=3 ,Thread=Thread-1
end main()
No comments:
Post a Comment