现在有T1,T2,T3三个线程,怎么保证T2在T1执行完后执行,T3在T2执行完后执行

使用join();

public class Main{
    public static void main(String[] args) {
        Thread T1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(1111);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        T1.start();

        Thread T2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    T1.join();
                    System.out.println(2222);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        T2.start();

        Thread T3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    T2.join();
                    System.out.println(3333);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        T3.start();
    }
}

join()的作用?

Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。

join方法传参和不传参的区别:

join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。 需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。

join与start调用顺序

join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。因为执行完start方法才会创建线程。

join方法实现原理

深入底层:join()调用了join(0),而join(final long millis)是一个synchronized 的同步方法,join(final long millis)调用了wait方法来实现。 是怎么通过wait()来实现join的呢? 举个例子,join是在main方法里被调用了。 然后main方法就持有了 join方法 的 这个锁。 然后join 方法里面调用了 wait方法。 这个过程的目的是让持有这个同步锁的线程进入等待。 那么谁持有了这个同步锁呢? 答案就是main方法,因为main方法调用了join方法。 main方法就持有 synchronized 标记的这个锁,谁持有这个锁谁就等待。 wait()方法只会让持有锁的线程进入等待,而启动线程的 start() 并没有持有锁,所以 strat方法还是会执行,而join方法中的wait方法 使main 方法等待了。 所以main方法就没有获取到CPU资源, 所以main方法中的 thread2 就没有办法获取CPU资源。 然后join方法执行完之后,不用想,JVM底层肯定执行了 notify的操作。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11293次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
2011次浏览 42人参与
# 巨人网络春招 #
11386次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7679次浏览 43人参与
# 简历第一个项目做什么 #
31779次浏览 342人参与
# 重来一次,我还会选择这个专业吗 #
433626次浏览 3926人参与
# 米连集团26产品管培生项目 #
6078次浏览 216人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187250次浏览 1122人参与
# 牛客AI文生图 #
21454次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152499次浏览 888人参与
# 研究所笔面经互助 #
118981次浏览 577人参与
# 简历中的项目经历要怎么写? #
310438次浏览 4222人参与
# AI时代,哪些岗位最容易被淘汰 #
63945次浏览 831人参与
# 面试紧张时你会有什么表现? #
30525次浏览 188人参与
# 你今年的平均薪资是多少? #
213177次浏览 1039人参与
# 你怎么看待AI面试 #
180226次浏览 1260人参与
# 高学历就一定能找到好工作吗? #
64344次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76595次浏览 374人参与
# 我的求职精神状态 #
448203次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363582次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160699次浏览 1112人参与
# 校招笔试 #
471384次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务