JAVA中JOIN和WAIT的关系

JAVA中JOIN和WAIT的关系

首先上代码1:

这里写图片描述

执行结果1:

main end !!!
Thread-0 running ...
Thread-0 end ...

代码2:

这里写图片描述

执行结果2:

Thread-0 running ...
Thread-0 end ...
main end !!!

可以知道,join方法,可以使得某个线程阻塞执行,让出cpu给其他线程,此示例就是,main线程被阻塞执行让出cpu给TimerThread线程,知道TimerThread线程执行结束后,main线程才会继续执行。

然后,进入join源码看下:

这里写图片描述

可以看出,调用了wait方法。wait方法大家一定比我熟悉,这里不多说。但是不禁有个疑问?为什么不是TimerThread线程阻塞而是main线程阻塞?带着这个疑问,我们继续往下看。

一个线程执行结束后,会做什么?有这么一段代码,如下:

这里写图片描述

执行main函数代码:

    Test2 test = new Test2();
    Thread2 thread2 = test.new Thread2();
    Thread1 thread1 = test.new Thread1(thread2);
    thread2.start();
    thread1.start();

执行结果:

enter thread2
enter thread1
thread2  synchronized begin
thread2 wait begin...
thread2  wait over ,cost 3 秒

分析:

有两个线程,Thread1和Thread2,Thread1持有Thread2的线程对象锁,Thread2一个耗时3秒的操作。执行时,先进入thread2(当然也可能先进入thread1),thread1进入同步代码块之前先获取到thread2的对象锁,获取到锁之后继续执行,然后一直到wait方法,thread1就暂停执行,此时肯定还没到3秒,thread1暂停后,thread2在3秒后结束执行,此时,神奇的是thread1又继续开始执行了。由于thread1持有的锁是thread2对象,所以只有当thread1收到一个notify的通知并且通知的持有的锁对象是thread2的时候,才有可能继续执行,所以,可以断定,thread2在执行结束之后,会发一个notifyAll到其他线程,而通知的锁对象就是thread2自己。而当thread1收到notify通知后,会再去获取thread2锁,如果获取到了锁就会继续执行,如果获取不到则会等待锁的释放后再去竞争。

我们再来看一段代码:

这里写图片描述

main代码:

    Test test = new Test();
    Thread1 thread1 = test.new Thread1();
    thread1.start();
    thread1.join2(0);
    out.println("main end");

执行结果:

main join begin
Thread1 run
Thread1 end
main join end ,cost 2 秒
main end

结果分析:

Thread1执行后调用了自己写的join方法(不是原生的join方法),由于thread1.start();后,由于thread1.isAlive()就为true了,所以会进入wait代码,但是,重点来了,调用wait的代码,和调用wait的对象无关,只和调用wait的线程有关。此时的wait(0)就等效于this.wait(0),this是thread1,但是虽然是thread1调用的wait,但是可以把thread1看作一个普通的对象而已,在源码中,wait一定是得到当前的线程,然后进行后续的操作,所以,当前调用wait(0)的线程是main线程,所以main线程会被阻塞。加上,由于阻塞的时候的锁对象是this,也就是thread1,所以,当thread1自己运行结束后,会notifyAll所有持有thread1的锁的在wait状态下的其他线程(此处为main线程),所以main线程就会在thread1执行结束之后继续执行。

so

调用原生的join方法时,也是调用了wait方法,也就是会阻塞调用的线程(切记不是调用join方法的那个线程对象,这只是一个普通对象而已),所以,一切就都可以理解了。。。

另外 推荐一个mysql生成器网页版
http://tqyebook.duapp.com/manage/fileUpload.html

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值