• 技术文章 >java >java基础

    java中join的原理

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

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

    1.join()概念

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

    2.join()源码

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    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()实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    //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() + ": 主线程开始执行");

     }

    打印日志:

    1

    2

    3

    4

    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学习网