Java Multithreading concept and join() method

后端 未结 12 1395
太阳男子
太阳男子 2020-11-28 01:39

I\'m confused in join() method used in Threads in Java. In the following code:

// Using join() to wait for threads to finish.
class NewThread im         


        
12条回答
  •  旧巷少年郎
    2020-11-28 02:20

    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()
    

    For more information see my blog:

    http://javaexplorer03.blogspot.in/2016/05/join-method-in-java.html

提交回复
热议问题