java中join的原理

美女程序员鼓励师

我们都知道程序中多线程,不同线程之间的运行顺序是我们要考虑的问题。我们可以使用一种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的原理 的全部内容, 来源链接: utcz.com/z/542449.html

回到顶部