Java多线程编程核心技术之方法join的使用

版权声明: https://blog.csdn.net/Soul_Programmer_Swh/article/details/85802837

使用场景        

        在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,这时,如果主线程向等待子线程执行完成后再结束,就需要用到join()方法了。

        join()的作用是等待线程对象销毁。

        方法join具有使线程排队运行的作用,有些类似同步的运行效果。join与synchronized的区别是:join在内部使用了wait()方法进行等待,而synchronized关键字使用的是“对象监视器”原理作为同步。

方法join与异常

        在join方法执行过程中,如果当前线程对象被中断interrupt(),则当前线程会出现异常:java.lang.InterruptedException

方法join(long)的使用

        方法join(long)中的参数是设定等待的时间。

join(2000)和sleep(2000)的区别

        主要体现在对同步的处理上。

        方法join(long)的功能在内部是使用wait(long)方法来实现的,所以join(long)方法具有释放锁的特点。而方法Thread.sleep(long)却不释放锁。

        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()后面的代码会提前运行

如果读者对此有兴趣可以给我评论,我会在评论中对此现象做出解释。

猜你喜欢

转载自blog.csdn.net/Soul_Programmer_Swh/article/details/85802837