关于Java多线程的join()方法的问题

最近在复习多线程只是,遇到这样一个问题,先看一下图:
图片说明
图中画出join与sleep实现了相同的效果,那就是让当前线程处于阻塞状态,但是这个状态中,线程的对象锁依然存在,不同于wait方法;
而实际上join的实现内部使用的是wait方法,那么请问是图画错了还是我理解的有问题;

3个回答

1.sleep()方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
2.sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当**指定的时间**到了又会自动恢复运行状态。
再调用sleep()方法的过程中,线程不会释放对象锁。
3.Join方法实现是通过wait(小提示:Object 提供的方法)。 比如主线程为main,当main线程调用子线程join时候,main线程会获得子线程线程对象的锁(wait 意味着拿到该对象的锁),调用该子线程对象的wait(等待时间),直到该子线程对象唤醒main线程 ,比如退出后。这就意味着main 线程调用子线程join时,必须能够拿到线程对象的锁。
sleep:常用于简单的等待,比如死循环里面一直处理数据,让程序休息比较短的时间等情况下
join方法常用主线程等都所有子线程执行完了再继续执行,比如多个子线程并发计算,主线程要用所有子线程计算的结果,或者汇总结果

yangxingzou
zoyation 回复candy_rainbow: 主线程调用子线程对象的join是在主线程下调用的,这样子线程运行的时候就和主线程关联上,当子线程都执行完后,就能唤醒主线程
一年多之前 回复
yangxingzou
zoyation 回复candy_rainbow: 要记住join方法是在main线程调用的子线程对象的join,子线程对象容易产生误解,子线程对象不代表子线程,主线程调用就是让主线程等待
一年多之前 回复
yangxingzou
zoyation 回复candy_rainbow: 不是main线程获取对象锁然后执行wait,而是main线程执行wait获取对象锁(调用join是在main线程,join只是对象的一个方法,wait是主线程wait,并不是子线程里调用),然后main线程不是应该就放弃对象锁进入等待队列吗(这里实际就是main线程等待),直到被notify或者notifyall唤醒才会进入锁池队列争夺对象锁
一年多之前 回复
candy_rainbow
candy_rainbow main线程获取对象锁然后执行wait,然后main线程不是应该就放弃对象锁进入等待队列吗,直到被notify或者notifyall唤醒才会进入锁池队列争夺对象锁,我说的对吧?
一年多之前 回复

1、首先wait(0)表示无限等待,直到唤醒;
2、什么东西可以调用wait方法,虽然wait是Object的方法,好像所有的对象都可以调用,但JDK里面的解释已经说了
图片说明
意思就是说:该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方式的说明,请参阅notify方法;
3、监视器所有权:就是说,当前有那个对象获得了监视器,这个对象就可以执行某些代码片段,直到走完这段代码,释放监视器,也就是锁;
4、获取监视器的对象的线程才能调用wait方法。
当一个主线程里面有个子线程,子线程对象.start()方法,因为start方法加锁了,所以子线程对象获得了监视器,但是这个对象其实是主线程的,所以可以说是主线程获得了监视器,所以只有主线程才能执行wait(0)方法,也就是主线程挂起,释放监视器,这时候t1子线程获得监视器,当他代码执行完了,就会调用notifiyAll()方法唤醒所有的wait线程,之后子线程就释放了监视器,主线程被唤起了,并且得到了CPU分配的分片权限,开始继续执行代码。
个人理解:监视器和对象锁差不多,但是要执行wait和notify方法的线程,哪个线程就需要持有那个有监视器的对象。

个人猜测是这样????

xionglangs
编程爱好者熊浪 开始main线程拥有监视器,所以main线程执行了wait方法,之后main线程暂停了。子线程执行完成后会调用notifyAll的方法唤醒主线程。
一年多之前 回复
candy_rainbow
candy_rainbow 我有点没看懂,按道理main线程调用了wait方法本身就应该放弃对象锁了,但是阻塞状态的线程不会放弃对象锁,因此不是应该进入等待队列等待notify唤醒吗?
一年多之前 回复

ThreadA.join();这段代码在Main线程中被执行,则Main线程阻塞,ThreadA执行。所以上图说的进入阻塞没问题。只不过应该理解为Main线程阻塞,(即这行语句在哪个线程中执行,谁阻塞)。

candy_rainbow
candy_rainbow 阻塞状态是不会放弃对象锁的呀,但是一旦调用wai方法本身就会放弃对象锁了
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问