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方法可以控制多線程的執行順序。
