美文网首页
Java线程join()

Java线程join()

作者: greatseniorsde | 来源:发表于2018-11-04 12:15 被阅读0次

    join 方法是一个阻塞方法,用来进行线程之间的交流。线程 A 调用 线程 B 的 join 方法,则线程 A 将阻塞,线程 B 执行结束后 线程 A 开始执行。

     was trying to do some analysis on calling start and join simultaneously,
    
        //Starting and Joining 
        for (Thread thread : threadArray) {
            thread.start();
            thread.join();
        }
    compared with start first and then join.
    
        //Starting Them
        for (Thread thread : threadArray) {
            thread.start();
        }
        //Joining Them
        for (Thread thread : threadArray) {
            thread.join();
        }
    
    

    第一种方法,实际上是所有threads run sequentially. 因为main thread每一次都要等当前thread结束后才能执行下面的语句;
    第二种方法,是可以实现threads run concurrently的.main thread会等待他们全部执行完之后才结束。

    另一个例子:

    public class ThreadJoinExample {
    
        public static void main(String[] args) {
            Thread t1 = new Thread(new MyRunnable(), "t1");
            Thread t2 = new Thread(new MyRunnable(), "t2");
            Thread t3 = new Thread(new MyRunnable(), "t3");
            
            t1.start();
            
            //start second thread after waiting for 2 seconds or if it's dead
            try {
                t1.join(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            t2.start();
            
            //start third thread only when first thread is dead
            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            t3.start();
            
            //let all threads finish execution before finishing main thread
            try {
                t1.join();
                t2.join();
                t3.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            System.out.println("All threads are dead, exiting main thread");
        }
    
    }
    
    class MyRunnable implements Runnable{
    
        @Override
        public void run() {
            System.out.println("Thread started:::"+Thread.currentThread().getName());
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread ended:::"+Thread.currentThread().getName());
        }   
    }
    

    输出:

    Thread started:::t1
    Thread ended:::t1
    Thread started:::t2
    Thread started:::t3
    Thread ended:::t2
    Thread ended:::t3
    All threads are dead, exiting main thread
    
    All threads are dead, exiting main thread
    

    相关文章

      网友评论

          本文标题:Java线程join()

          本文链接:https://www.haomeiwen.com/subject/szerxqtx.html