1. 程式人生 > >Java join()方法的使用

Java join()方法的使用

文章目錄

  一、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執行緒,從而達到同步的目的。