有三個線程T1,T2,T3,怎麼確保它們按順序執行?
可以利用Thread類的join方法。Thread類中的join方法的主要作用就是同步,它可以使得線程之間的並行執行變爲串行執行。當我們調用某個線程的這個方法時,這個方法會掛起調用線程,直到被調用線程結束執行,調用線程纔會繼續執行。
示例:
public class JoinTestSync {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ThreadJoinTest1 t1 = new ThreadJoinTest1("今天");
ThreadJoinTest1 t2 = new ThreadJoinTest1("明天");
ThreadJoinTest1 t3 = new ThreadJoinTest1("後天");
/*
* 通過join方法來確保t1、t2、t3的執行順序
* */
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
}
}
class ThreadJoinTest1 extends Thread{
public ThreadJoinTest1(String name){
super(name);
}
@Override
public void run(){
for(int i=0;i<5;i++){
System.out.println(this.getName() + ":" + i);
}
}
}
join方法傳參和不傳參的區別?
join方法中如果傳入參數,則表示這樣的意思:如果A線程中調用B線程的join(10),則表示A線程會等待B線程執行10毫秒,10毫秒過後,A、B線程並行執行。需要注意的是,jdk規定,join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時間,直到B線程執行完畢,即join(0)等價於join()。
join方法實現原理
join方法是通過調用線程的wait方法來達到同步的目的的。例如A線程中調用了B線程的join方法,則相當於在A線程中調用了B線程的wait方法,當B線程執行完(或者到達等待時間),B線程會自動調用自身的notifyAll方法喚醒A線程,從而達到同步的目的。