Thread類的join()方法

public class Demo {

    /**
     * Thread類的join()方法
     * --------------------------------
     * 1)join()
     * 2)join(long millis)
     * 3)join(long millis, int nanos)
     * 用法見代碼中註釋,可經過調整睡眠時間一一驗證。
     */
    public static void main(String[] args) {

        // 建立一個線程組
        ThreadGroup threadGroup = new ThreadGroup("ThreadGroup1");

        // 在該線程組下建立一個線程t1
        Thread t1 = new Thread(threadGroup, new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000); // 3秒後執行
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread1 end ...");
            }
        }, "Thread1");

        // 在該線程組下建立一個線程t2
        Thread t2 = new Thread(threadGroup, new Runnable() {
            @Override
            public void run() {
                try {
                    /*
                     * t1.join();
                     * ----------------------------
                     * 等同於 t1.join(0); t1執行結束後執行t2.
                     */
                    t1.join();

                    /*
                     * t1.join(1000);
                     * ----------------------------
                     * 等最多1s直至t1死亡。
                     *     |- 若是1s內t1沒死,t1執行1s後開始執行t2;
                     *     |- 若是1s內t1死了,不用等滿1s直接開始執行t2;
                     */
                    // t1.join(1000);

                    /*
                     * t1.join(1000, 1000);
                     * -----------------------------------------
                     * 相似t1.join(1000);
                     *     第一個1000,單位是毫秒,第二個1000單位是納秒 .
                     *     |- 若是第一個參數不是1000,而是0,效果等同 t1.join(0 + 1);
                     *     |- 若是第二個參數大於50萬,效果等同 t1.join(1000 + 1);
                     *     |- 若是第一個參數不爲0,第二個參數小於50萬,效果等同 t1.join(1000);
                     *  有點延時執行的意思。可是延時的時間只能是0毫秒或1毫秒。
                     */
                    // t1.join(1000, 1000);

                    Thread.sleep(1000); // 1s後執行
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread2 end ...");
            }
        }, "Thread2");

        // 啓動線程
        t1.start();
        t2.start();
    }
}
相關文章
相關標籤/搜索