1. 程式人生 > >Java執行緒之join

Java執行緒之join

簡述

Thread類的join方法用來使main執行緒進入阻塞狀態,進而等待呼叫join方法的執行緒執行,join有三個過載方法:

public final void join()
使主執行緒進入阻塞狀態,直到呼叫join的執行緒執行完成,如果執行緒被中斷將丟擲InterruptedException異常

public final synchronized void join(long millis):
使主執行緒最多阻塞指定時間(毫秒)

public final synchronized void join(long millis, int nanos)
使主執行緒最多阻塞指定時間(毫秒),可以精確到納秒

例項

主執行緒等待所有子執行緒先執行完成

package com.lkf.mulithread;

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(); //兩秒鐘以後啟動第二個執行緒 try { t1.join(2000); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); //第一個執行緒完成之後啟動第三個執行緒 try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } t3.start(); //三個子執行緒先執行完,然後繼續主執行緒
try { t1.join(); t2.join(); t3.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("所有執行緒執行完畢"); } } 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 started:::執行緒t2
Thread ended:::執行緒t1
Thread started:::執行緒t3
Thread ended:::執行緒t2
Thread ended:::執行緒t3
所有執行緒執行完畢