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();
    }
}

 

posted @ 2017-12-21 16:22  迷失之路  阅读(298)  评论(0编辑  收藏  举报