多线程之join方法

多线程之join方法一.前言:    在很多情况下,我们都是通过主线程创建并启动子线程的,如果子线程中需要耗费大量的时间计算的话,主线程往往会比子线程先结束,这个时候就会导致有时候主线程想获取子线程计算之后的结果,但是却获取不到。这个时候,我们就可以通过join方法来解决这个问题。二.join方法的作用:join方法的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的…

大家好,又见面了,我是你们的朋友全栈君。

一.前言:

       在很多情况下,我们都是通过主线程创建并启动子线程的,如果子线程中需要耗费大量的时间计算的话,主线程往往会比子线程先结束,这个时候就会导致有时候主线程想获取子线程计算之后的结果,但是却获取不到。这个时候,我们就可以通过join方法来解决这个问题。

二.join方法的作用:

join方法的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z后面的代码。方法join具有使线程排队运行的作用,有些类似同步的运行效果。

下面看一个例子:

public class MyThread extends Thread{
    @Override
    public void run() {
        int sencondValue = (int)(Math.random()*1000);
        System.out.println(sencondValue);
        try {
            Thread.sleep(sencondValue);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Run {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        myThread.start();
        myThread.join();
        System.out.println("当对象myThread执行完毕后再执行");
    }
}

运行结果:多线程之join方法join的意思是使得放弃当前线程的执行,并返回对应的线程,例如上面代码的意思就是:程序在main线程中调用myThread线程的join方法,则main线程放弃cpu控制权,并返回myThread线程继续执行直到线程myThread执行完毕。所以结果是线程myThread执行完后,才到主线程执行,相当于在main线程中同步线程myThreadmyThread执行完了,main线程才有执行的机会 此外,join方法和interrupt方法相遇的时候会抛出异常。

此外,还有join(long millis)方法,指定要等待多长时间。

三.join的实现原理:

查看join方法源码:

/**
     * Waits for this thread to die.
     *
     * <p> An invocation of this method behaves in exactly the same
     * way as the invocation
     *
     * <blockquote>
     * {@linkplain #join(long) join}{@code (0)}
     * </blockquote>
     *
     * @throws  InterruptedException
     *          if any thread has interrupted the current thread. The
     *          <i>interrupted status</i> of the current thread is
     *          cleared when this exception is thrown.
     */
    public final void join() throws InterruptedException {
        join(0);
    }
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线程就会进入阻塞状态,因为它相当于放弃了CPU的使用权。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。

四.join方法和synchronized、sleep方法的区别:

1.从上面的源码我们可以看出,join(long millis)是通过在内部使用wait(long millis)方法来实现的,所有它其实是具有释放锁的特点的,在执行完;而sleep(long millis)是不释放锁的,也就是如果有Synchronized同步块,其他线程仍然不能访问共享数据。注意该方法要捕获异常。

2.join在内部使用wait()方法进行等待,而synchronized关键字使用的是“对象监控器”原理做同步,具体可以看这个synchronized原理

 

参考:https://www.2cto.com/kf/201608/543154.html

           https://www.cnblogs.com/lcplcpjava/p/6896904.html

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136897.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • eclipse修改工程文件编码

    eclipse修改工程文件编码eclipse修改工程文件编码

    2022年4月23日
    53
  • Android手机以L2TP方式连接LAVAVPN的设置方法

    Android手机以L2TP方式连接LAVAVPN的设置方法1.准备首先手机要打开WIFI或GPRS或3G连接,确保网络畅通。建议用WIFI网络测试,因为部分地区的GPRS或3G网络不支持或屏蔽VPN通讯。2.打开手机主菜单,选择"设置"3

    2022年7月2日
    33
  • 空间尺度分析_特征尺度的选取原则

    空间尺度分析_特征尺度的选取原则特征点尺度变换高斯核是唯一可以产生多尺度空间的核,高斯模板具有圆对称性,通过高斯卷积操作对原始像素值重新分配权重,距离中心越远的相邻像素值权重分配相对较小。二维矩阵变换的高斯平滑操作可以通过在水平和竖直方向上分别进行一维高斯矩阵变换相加得到。尺度是自然客观存在的,不是主观创造的,高斯卷积只是表现尺度空间的一种形式。示例代码如下:voidCreateScaleSpace(cv::M…

    2022年10月14日
    0
  • navicat for mysql激活码【中文破解版】2022.02.19

    (navicat for mysql激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~LGWSVFD4PZ-eyJsaWNlb…

    2022年4月1日
    153
  • java jce_了解Java JCE的加密

    java jce_了解Java JCE的加密阅读提示:Java密码扩展(TheJavaCryptographyExtension),是JDK1.4的一个重要部分,本文介绍JCE的安装和使用。首先演示如果安装配置JCE(静态安装),然后是如何在不安装的情况下使用JCE(动态安装)。最后,将演示怎么生成密钥和密码,及如果进行基本的加密、解密。Java密码扩展(TheJavaCryptographyExtension),是JDK1.4…

    2022年6月29日
    26
  • Linux>>CentOS 7镜像下载「建议收藏」

    Linux>>CentOS 7镜像下载「建议收藏」CentOS7镜像下载官网下载链接:http://isoredirect.centos.org/centos/7/isos/x86_64/step1:进入下载页,选择阿里云站点进行下载ActualCountry国内资源NearbyCountries周边国家资源阿里云站点:http://mirrors.aliyun.com/centos/7/isos/x86_64/每…

    2022年4月19日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号