1. 程式人生 > >多線程-join()方法

多線程-join()方法

mat 原理 監視 ron 運行 啟動 package stack rup

在很多情況下,主進程創建並啟動子線程,如果子線程中要進行大量的耗時運算,主線程往往將早於子線程結束之前結束。這時,如果主線程想等待子線程執行完成之後再結束,比如子線程處理一個數據,主線程要取得這個數據中的值,就要用到join()方法了。方法join()的作用是等待線程對象銷毀。

package org.github.lujiango;

public class Test01 {

    static class MyThread extends Thread {
        @Override
        public void run() {
            try {
                int sec = (int) (Math.random() * 10000);
                System.out.println(sec);
                Thread.sleep(sec);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            MyThread t = new MyThread();
            t.start();
            t.join();
            System.out.println("我想當t對象執行完畢後我再執行...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

方法join的作用是使所屬的線程對象x正常執行run()方法中的任務,而使當前線程z進行無限期的阻塞,等待線程x銷毀後再繼續執行線程z後面的代碼。
方法join具有使線程排隊運行的作用,有些類似同步的運行效果。join與synchronized的區別是:join在內部使用wait()方法進行等待,而sychronized關鍵字使用的是“對象監視器”原理作為同步。
join方法的簽名
join的功能內部是使用wait(long)方法來實現的,所有join方法具有釋放鎖的特點:

 public final void join() throws InterruptedException{
                join(0); 
 }

@param millis 等待時間,單位:毫秒(如果超時,則因為另一個線程join而導致阻塞的線程繼續執行)

public final synchronized void join(long millis) throws InterruptedException {}

join與異常

在join過程中,如果當前線程對象被中斷,則當前線程出現異常。  

package org.github.lujiango;

public class Test02 {

    static class ThreadA extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                String newString = new String();
                Math.random();
            }
        }
    }

    static class ThreadB extends Thread {
        @Override
        public void run() {
            try {
                ThreadA a = new ThreadA();
                a.start();
                a.join();
                System.out.println("Thread B run end...");
            } catch (Exception e) {
                System.out.println("Thread B catch");
                e.printStackTrace();

            }
        }
    }

    static class ThreadC extends Thread {
        private ThreadB threadB;

        public ThreadC(ThreadB threadB) {
            this.threadB = threadB;
        }

        @Override
        public void run() {
            threadB.interrupt();
        }
    }

    public static void main(String[] args) {
        try {
            ThreadB b = new ThreadB();
            b.start();
            Thread.sleep(500);
            ThreadC c = new ThreadC(b);
            c.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

join與interrupt方法如果遇到,就會出現異常,但今次按鈕還是呈“紅色”,原因是線程a還在繼續運行,a為出現異常,是正常執行的狀態。

多線程-join()方法