示例一
package myk; public class ThreadDemo1 { public static void main(String[] args) { TestThread tt = new TestThread(); Thread pp = new Thread(tt); pp.start(); int i = 0; while (true){ if(i==100){ try{ pp.join();//该方法的作用是把pp所对应的线程合并到调用pp.join(),该线程没有执行完毕,主线程是不能执行的
//还有连个带参数的join()方法,分别是join(long millis) 和join(long millis,int nanos),前者精确到毫秒,后者精确到纳秒 }catch(Exception e){ System.out.println(e.getMessage()); } } System.out.println("main Thread "+i++); } } } class TestThread implements Runnable{ int i = 0 ; public void run(){ while(true){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" " + i++); } } } //result //main Thread 92 //main Thread 93 //main Thread 94 //main Thread 95 //main Thread 96 //main Thread 97 //main Thread 98 //main Thread 99 //Thread-0 0 //Thread-0 1 //Thread-0 2 //Thread-0 3 //Thread-0 4 //Thread-0 5 //Thread-0 6 //Thread-0 7
示例二
从该示例可以看出,可以等待多个子线程全部执行完毕再执行主线程,这点在实际应用中经常碰到
package myk; public class ThreadDemo1 { public static void main(String[] args) { TestThread tt = new TestThread(); Thread p1 = new Thread(tt); Thread p2 = new Thread(tt); Thread p3 = new Thread(tt); p1.start(); p2.start(); p3.start(); int i = 0; while (true){ if(i==100){ try{ p1.join(); p2.join(); p3.join(); }catch(Exception e){ System.out.println(e.getMessage()); } } System.out.println("main Thread "+i++); } } } class TestThread implements Runnable{ int i = 0 ; public void run(){ while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" " + i++); } } } //result //main Thread 93 //main Thread 94 //main Thread 95 //main Thread 96 //main Thread 97 //main Thread 98 //main Thread 99 //Thread-0 0 //Thread-1 1 //Thread-2 2 //Thread-2 3 //Thread-1 4 //Thread-0 5 //Thread-0 6 //Thread-1 7