join做用是阻塞主線程一直到子線程運行完畢java
package com.ydy.thread; import java.util.concurrent.atomic.AtomicInteger; class Add implements Runnable{ private AtomicInteger count=new AtomicInteger(0); @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<100000000;i++) { count.incrementAndGet(); } } public AtomicInteger getCount() { return count; } } public class JoinTest { public static void main(String[] args) throws Exception { Add add=new Add(); Thread t1=new Thread(add); Thread t2=new Thread(add); t1.start(); t2.start(); t1.join();//阻塞main線程,一直到t1線程運行完畢 System.out.println("t1.join()"); t2.join(); System.out.println("t2.join()"); System.out.println("countAll"+add.getCount()); } }
join實現原理是基於wait機制,如下代碼選自java.lang.Threadide
public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }