• 技术文章 >java >java基础

    java中join的原理

    小妮浅浅小妮浅浅2021-01-08 15:34:11原创2606

    我们都知道程序中多线程,不同线程之间的运行顺序是我们要考虑的问题。我们可以使用一种join()方法,来对线程执行的顺序进行定义。当某一线程执行完,再运行下一个线程。下面我们就join()概念和源码进行分析和理解,然后带来join()使用方法的实例介绍,一起来看具体内容。

    1.join()概念

    一直等待直到该线程死亡,可以指定等待指定时间内线程死亡,否则,一直在循环判断线程。如果join的方法在线程实例中被调用,当前运行的线程会被堵塞,直到线程实例运行完成。

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

    可以看出它是利用wait方法来实现的,上面的例子当main方法主线程调用线程t的时候,main方法获取到了t的对象锁,而t调用自身wait方法进行阻塞,只要当t结束或者到时间后才会退出,接着唤醒主线程继续执行。millis为主线程等待t线程最长执行多久,0为永久直到t线程执行结束。

    3.join()实例

       //join抢占CPU时间片
        public static void joinTest() throws InterruptedException {
            //定义一个线程
            Thread thread = new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + ": 测试线程开始执行。。。");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ": 测试线程执行结束了。");
            });
            thread.start();
            System.out.println(thread.getName() + ": 执行join方法");
            thread.join();
            System.out.println(Thread.currentThread().getName() + ": 主线程开始执行");
        }

    打印日志:

    Thread-0: 执行join方法
    Thread-0: 测试线程开始执行。。。
    Thread-0: 测试线程执行结束了。
    main: 主线程开始执行

    以上就是java中join的原理,学会后我们可以对线程的任务顺序进行操作,看懂join的原理后,就试试代码部分的使用吧。

    专题推荐:java join原理
    上一篇:yield在java中的使用 下一篇:java线程的run方法是什么意思

    相关文章推荐

    • java守护线程应用• java中Thread的停止• java中wait是什么意思• java notify()的唤醒• java中使用notifyall• sleep在java中的实现• yield在java中的使用

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网