package com.cn.test.thread; public class TestJoin extends Thread{ private String name; public TestJoin(String name) { this.name = name; } public static void main(String[] args) { TestJoin join1 = new TestJoin("thread-1"); TestJoin join2 = new TestJoin("thread-2"); join1.start(); join2.start(); try { join1.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("main--------------------線程"); } @Override public void run() { for (int i=0; i<3; i++) { System.out.println(Thread.currentThread().getName() + "i=" + i) ; } } }
上述例子中: 在main方法中join1線程調用join方法,如果main方法搶到cpu的執行權,會將cpu的執行權讓出來給join1線程,直到join1線程執行完畢之后才進行main線程的執行。join1和join2是同步進行競爭cpu的資源。
運行結果:
Thread-0i=0 Thread-1i=0 Thread-0i=1 Thread-1i=1 Thread-0i=2 Thread-1i=2 main--------------------線程
main線程需要等待join1線程執行完畢之后才能進行執行
Thread的join方法在start方法之前進行執行,不會觸發這種cpu讓出執行權的操作,此時和mian線程是並發執行的。
package com.cn.test.thread; public class TestJoin extends Thread{ private String name; public TestJoin(String name) { this.name = name; } public static void main(String[] args) { TestJoin join1 = new TestJoin("thread-1"); TestJoin join2 = new TestJoin("thread-2"); try { join1.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } join1.start(); join2.start(); System.out.println("main--------------------線程"); } @Override public void run() { for (int i=0; i<3; i++) { System.out.println(Thread.currentThread().getName() + "i=" + i) ; } } }
執行結果:
main--------------------線程 Thread-1i=0 Thread-1i=1 Thread-1i=2 Thread-0i=0 Thread-0i=1 Thread-0i=2
總結:join方法可以控制多線程的執行順序。