Java join()方法的使用
阿新 • • 發佈:2019-02-18
文章目錄
一、join()方法的作用
二、join()和start()呼叫順序問題
三、join()方法實現原理
一、join()方法的作用
主要作用是同步,它可以使得執行緒之間的並行執行變為序列執行。在A執行緒中呼叫了B執行緒的join()方法時,表示只有當B執行緒執行完畢時,A執行緒才能繼續執行。
看如下程式碼
class JoinThread implements Runnable
{
//重寫run方法
public void run()
{
for(int i = 0; i< 30;i++)
{
System.out.println(Thread.currentThread().getName()+"..." +i);
}
}
}
//main方法如下
public static void main(String[] args) throws InterruptedException
{
JoinThread object = new JoinThread();
Thread t1 = new Thread(object);
Thread t2 = new Thread(object);
t1.start();
t1.join();
t2.start();
/**
* 主執行緒執行到這裡,放棄執行資格,此時活著的執行緒只有t1和t2,
*
* 那麼此時t1和t2交替執行,當t1執行完,主執行緒才能繼續執行,
* 也就是說,主執行緒重新獲取執行資格跟t2是否執行完沒有半毛錢關係
*
* */
//t1.join();
for(int j = 0;j < 50;j++)
{
System.out.println(Thread.currentThread().getName()+"..."+j);
}
}
上面程式執行結果 : t1執行完,t2和主執行緒交替執行。
注意下面細節
join()方法中如果傳入引數,則表示這樣的意思:如果A執行緒中掉用B執行緒的join(10),則表示A執行緒會等待B執行緒執行10毫秒,10毫秒過後,A、B執行緒並行執行。需要注意的是,jdk規定,join(0)的意思不是A執行緒等待B執行緒0秒,而是A執行緒等待B執行緒無限時間,直到B執行緒執行完畢,即join(0)等價於join()
二、join()和start()呼叫順序問題
這樣講起來也很簡單,我們線上程start()前先把變成join()下就知道結果了。程式碼就不寫了,猜想和實際一致,join()方法必須線上程start()方法呼叫之後呼叫才有意義。一個執行緒都還未開始執行,同步是不具有任何意義的。
.
三、join()方法實現原理
看下原始碼實現
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
其實,join方法是通過呼叫執行緒的wait方法來達到同步的目的的。例如,A執行緒中呼叫了B執行緒的join方法,則相當於A執行緒呼叫了B執行緒的wait方法,在呼叫了B執行緒的wait方法後,A執行緒就會進入阻塞狀態。
join方法的原理就是呼叫相應執行緒的wait方法進行等待操作的,例如A執行緒中呼叫了B執行緒的join方法,則相當於在A執行緒中呼叫了B執行緒的wait方法,當B執行緒執行完(或者到達等待時間),B執行緒會自動呼叫自身的notifyAll方法喚醒A執行緒,從而達到同步的目的。