Thread的join方法[通俗易懂]

Thread的join方法[通俗易懂]Thread中的join方法主要的作用是让jion的线程加入当前线程,等加入的线程执行完之后才会执行当前线程。接下来看个例子:publicclassTestJoin{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadt1=newThread(()->{try{Thr

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

Thread中的join方法主要的作用是让jion的线程加入当前线程,等加入的线程执行完之后才会执行当前线程。

接下来看个例子:

public class TestJoin {

    public static void main(String[] args) throws InterruptedException {



        Thread t1 = new Thread(() ->
        {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("this is t1");
        });

        Thread t2 = new Thread(() -> {

            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("this is t2");
        });


        Thread t3 = new Thread(() -> {
            System.out.println("this is t3");
        });

        t1.start();
        t2.start();
        t3.start();
        t1.join();
        t2.join();
        t3.join();
        System.out.println("运行结束");
    }

}

输出结果为:

this is t3
this is t1
this is t2
运行结束

可以看到输出是线程t1,t2,t3输出之后,才会输出到主线程。所以可以看出来join方法是把其他线程加入当前线程,等加入线程执行完之后才会执行当前线程。

如果想要t1,t2,t3再顺序输出,只需要在每个start方法后面再调用join就行了。这就就保证了每次主线程运行完一个线程,再去运行另外一个线程。

修改上面代码为:

public class TestJoin {

    public static void main(String[] args) throws InterruptedException {


        Thread t1 = new Thread(() ->
        {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("this is t1");
        });

        Thread t2 = new Thread(() -> {

            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("this is t2");
        });


        Thread t3 = new Thread(() -> {
            System.out.println("this is t3");
        });

        t1.start();
        t1.join();
        t2.start();
        t2.join();
        t3.start();
        t3.join();
        System.out.println("运行结束");
    }

}

输出为:

this is t1
this is t2
this is t3
运行结束

 

接下来我们再从源码分析下Thread的join方法是怎么实现的:

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

 

由源码可以看到,其实底层就是wait方法,并且有一个while死循环,直到isAlive是False,也就是线程执行完成或者不存活。

顺带一提下Thread的yield的方法,此方法其实是只当前线程让出CPU回到就绪状态,线程再重新争抢CPU,但是结果可能是其他线程抢到CPU,也可能是自己抢到CPU。

 

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136450.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 干货|手把手教你写一个串口调试助手「建议收藏」

    干货|手把手教你写一个串口调试助手「建议收藏」摘要:前段时间发布了一个用QT写的串口调试助手,很多小伙伴在后台留言要源码。其实网上有很多免费开源的用QT的上位机,大家搜一下就能找到,为了大家方便学习QT以及如何写一个上位机,今天推荐一下学习资源,顺带带大家写一个非常简单的串口调试助手。相信很多小伙伴还没有接触过QT,如果想用QT写一个调试助手,首先是会一点C++语法。了解即可,也就是看得懂C++的代码。只要能看懂简单的C+++语法,就能很快的写一个串口调试助手。先推荐两个视频教程,感兴趣可以看看!1、B站Jomse工看完你基本知道串口调试助手

  • Selenium面试题

    Selenium面试题NO.1Selenium是什么是一个开源的web自动化测试的框架,支持多种编程语言,支持跨浏览器平台进行测试NO.2Selenium中有哪些验证点?Selenium主要有三种验证点检查页面标题检查某些文字检查某些元素(文本框,下拉菜单,表等)NO.3你如何从Selenium连接到数据库?Selenium是一个WebUI自动化工具。它不提供任何API来建立数据库连接。这取决于你使用Selenium进行自动化的编程语言。NO.4如何提高selenium脚本的执行速度?1.优

  • tomcat启动时乱码(tomcat打开是乱码)

    一、乱码图示二、解决方案1.进入安装路径下的conf文件夹>>找到logging.properties使用记事本打开2.找出图中的代码,将其修改为java.util.logging.ConsoleHandler.encoding=GBK三、验证是否解决问题进入命令行窗口,输入startup.bat运行乱码问题解决…

  • idea打包maven项目jar_tomcat部署maven项目

    idea打包maven项目jar_tomcat部署maven项目今天遇到一个需求,客户要求项目用maven管理,真是操碎了心,还好最终解决了,也在这里分享一下心得。首先选中要buide成maven的包——>右键——>addframeworksupport…,然后勾选maven即可;…

  • 使用pycharm创建Django项目[通俗易懂]

    使用pycharm创建Django项目[通俗易懂]创建项目1.使用命令行创建项目如果这是你第一次使用Django的话,你需要一些初始化设置。也就是说,你需要用一些自动生成的代码配置一个Djangoproject——即一个Django项目实例需要的设置项集合,包括数据库配置、Django配置和应用程序配置。打开命令行,cd到一个你想放置你代码的目录,然后运行以下命令:django-adminstartprojectmysite#mysite是项目名这行代码将会在当前目录下创建一个mysite目录。如果命令失

  • python 获取时间戳_python将日期转换成时间戳

    python 获取时间戳_python将日期转换成时间戳1、获取秒级、毫秒级和微秒级时间戳importtimeimportdatetimet=time.time()#当前时间print(t)#原始时间数据print(int(t))#秒级时间戳print(int(round(t*1000)))#毫秒级时间戳print(int(round(t*1000000)))#微秒级时间戳结果:1634191096.03610181634191096163419109603616341910960361

发表回复

您的电子邮箱地址不会被公开。

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