public class TestJoin { public static void main(String[] args) { Thread t1 = new MyThread("线程1"); Thread t2 = new MyThread("线程2"); Thread t3 = new MyThread("线程3"); try { //t1先启动 t1.start(); t1.join(); //t2 t2.start(); t2.join(); //t3 t3.start(); t3.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } class MyThread extend Thread{ public MyThread(String name){
setName(name);
} @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName()+": "+i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }
还有一种方式,在t3开始前join t2,在t2开始前join t1
public class TestJoin2 { public static void main(String[] args) { final Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("t1"); } }); final Thread t2 = new Thread(new Runnable() { @Override public void run() { try { //引用t1线程,等待t1线程执行完 t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("t2"); } }); Thread t3 = new Thread(new Runnable() { @Override public void run() { try { //引用t2线程,等待t2线程执行完 t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("t3"); } }); t3.start(); t2.start(); t1.start(); } }