Thread线程类实体方法join( )的理解

写在前面

这里总结一下主要是因为网上有关于join( )的一些介绍太过于稀碎,而且都是你抄我,我抄你,所以今天简单的总结一下。

概述

join( )方法,线程类的实体方法。用于在当前线程中加入其它线程运行。譬如在线程A中利用join( )加入线程B之后,线程A就会被阻塞掉,从而去执行线程B。当线程B执行完之后,线程A回到就绪态,等待cpu调度执行。

原理很简单,底层通过调用线程类的静态wait()方法,让当前线程释放锁。

测试一下

给出一组测试用例:

/**
 * 主要是来验证一下join()方法的运行机理和作用
 */
public class joinTest {
    public static void main(String[] args){
        Thread threadB = new Thread(new Runnable() {
            Thread threadA = new Thread(
                    () -> System.out.println("这是线程A在执行")
            );
            @Override
            public void run() {
                for(int i=0;i<30;i++){
                    System.out.println("这是线程B开始运行"+i);
                }
                try{
                    threadA.start();
                    threadA.join();
                }catch (InterruptedException e){
                    e.getMessage();
                }
                for(int j=0;j<30;j++){
                    System.out.println("这是线程B执行结束"+j);
                }
            }
        });
        threadB.start();
    }
}

运行结果如下:

这是线程B开始运行0
这是线程B开始运行1
这是线程B开始运行2
这是线程B开始运行3
这是线程B开始运行4
这是线程B开始运行5
这是线程B开始运行6
这是线程B开始运行7
这是线程B开始运行8
这是线程B开始运行9
这是线程B开始运行10
这是线程B开始运行11
这是线程B开始运行12
这是线程B开始运行13
这是线程B开始运行14
这是线程B开始运行15
这是线程B开始运行16
这是线程B开始运行17
这是线程B开始运行18
这是线程B开始运行19
这是线程B开始运行20
这是线程B开始运行21
这是线程B开始运行22
这是线程B开始运行23
这是线程B开始运行24
这是线程B开始运行25
这是线程B开始运行26
这是线程B开始运行27
这是线程B开始运行28
这是线程B开始运行29
这是线程A在执行
这是线程B执行结束0
这是线程B执行结束1
这是线程B执行结束2
这是线程B执行结束3
这是线程B执行结束4
这是线程B执行结束5
这是线程B执行结束6
这是线程B执行结束7
这是线程B执行结束8
这是线程B执行结束9
这是线程B执行结束10
这是线程B执行结束11
这是线程B执行结束12
这是线程B执行结束13
这是线程B执行结束14
这是线程B执行结束15
这是线程B执行结束16
这是线程B执行结束17
这是线程B执行结束18
这是线程B执行结束19
这是线程B执行结束20
这是线程B执行结束21
这是线程B执行结束22
这是线程B执行结束23
这是线程B执行结束24
这是线程B执行结束25
这是线程B执行结束26
这是线程B执行结束27
这是线程B执行结束28
这是线程B执行结束29

总结

值得注意的有三点:
1.join( )方法一定要在start( )之后执行才能起作用;
2.join( )方法经常用在让两个线程顺序执行,而不是交替执行;
3.join( )方法阻塞的是调用该方法的线程,譬如上述例子:是在threadB线程中调用了thread的join方法,故threadB被阻塞掉,等threadA执行完毕之后,threadB才会恢复到就绪态,等待cpu调度执行。

其他

其他值得注意的就是其两种调用方式,有参调用和无参调用,可以指定线程被阻塞等待的时间。这些东西在源码里面已经写得非常清楚了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值