java 线程 join()

本文详细解析了Java中线程的join方法,包括其应用场景、原理及与sleep方法的区别。通过示例代码展示了如何使用join方法确保线程执行顺序,避免因并发导致的数据不一致问题。

应用场景

在java中,等待另外一个线程执行完毕后,再执行,那就得用join方法了。
比如,需要使用线程A的结果,所以必须等待线程A执行完毕后,再继续执行。

Thread t = new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("自定义线程执行结束");
            }
        });
        t.start();
        //等待线程t执行完毕后,再继续执行
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        System.out.println("主线程运行结束");
// 执行结果是确定的,先执行t,再执行主线程
自定义线程执行结束
主线程运行结束

原理

查看join源码可知,join()=wait(0),让当前线程无限期等待;t.join()时,会让当前线程Main进入waiting状态,并释放对象监视器t;等t执行完毕后,销毁时(这部分在native代码里),会唤醒对象t上的所有等待线程,从而使主线程继续执行;

 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 vs sleep

join是Thread的实例方法,执行后,当前线程进入WAITING/TIMED_WAITING状态,会释放对象监视器;
sleep是Thread的静态方法,执行后,当前线程也会进入WAITING/TIMED_WAITING状态,但它不会释放对象监视器;

Java中,线程join()方法是一种同步方法,它允许一个线程等待一个线程执行完毕之后再继续执行。当在一个线程中调用一个线程join()方法时,调用线程会被阻塞,直到被调用的线程执行完毕。 join()方法有两种形式:无参的join()方法和带有参数的join(long millis)方法。无参的join()方法表示调用线程会一直等待被调用线程执行完毕,而带有参数的join(long millis)方法表示调用线程等待一段时间,如果时间到了还没有执行完毕,则会继续执行。例如,在一个线程中调用t1.join(10)表示主线程等待t1线程执行10毫秒,然后继续执行。 通过使用join()方法,可以使线程之间的并行执行变为串行执行,从而实现线程的同步。这对于需要等待其他线程完成某些任务后再继续执行的场景非常有用。 需要注意的是,join()方法只能在已经启动的线程上调用,否则会抛出IllegalThreadStateException异常。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java线程join()方法的作用和实现原理解析](https://blog.csdn.net/csdn_aiyang/article/details/126468579)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java线程(十一)join()方法](https://blog.csdn.net/maligebilaowang/article/details/129263836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值