当前位置: 首页>编程语言>正文

java wait超时释放 java wait join

JAVA中JOIN和WAIT的关系

首先上代码1:

java wait超时释放 java wait join,java wait超时释放 java wait join_对象锁,第1张

执行结果1:

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

代码2:

java wait超时释放 java wait join,java wait超时释放 java wait join_线程阻塞_02,第2张

执行结果2:

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

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

然后,进入join源码看下:

java wait超时释放 java wait join,java wait超时释放 java wait join_线程阻塞_03,第3张

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

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

java wait超时释放 java wait join,java wait超时释放 java wait join_对象锁_04,第4张

执行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锁,如果获取到了锁就会继续执行,如果获取不到则会等待锁的释放后再去竞争。

我们再来看一段代码:

java wait超时释放 java wait join,java wait超时释放 java wait join_线程阻塞_05,第5张

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



https://www.xamrdz.com/lan/55u1925735.html

相关文章: