最近在复习多线程只是,遇到这样一个问题,先看一下图:
图中画出join与sleep实现了相同的效果,那就是让当前线程处于阻塞状态,但是这个状态中,线程的对象锁依然存在,不同于wait方法;
而实际上join的实现内部使用的是wait方法,那么请问是图画错了还是我理解的有问题;
1.sleep()方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
2.sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当**指定的时间**到了又会自动恢复运行状态。
再调用sleep()方法的过程中,线程不会释放对象锁。
3.Join方法实现是通过wait(小提示:Object 提供的方法)。 比如主线程为main,当main线程调用子线程join时候,main线程会获得子线程线程对象的锁(wait 意味着拿到该对象的锁),调用该子线程对象的wait(等待时间),直到该子线程对象唤醒main线程 ,比如退出后。这就意味着main 线程调用子线程join时,必须能够拿到线程对象的锁。
sleep:常用于简单的等待,比如死循环里面一直处理数据,让程序休息比较短的时间等情况下
join方法常用主线程等都所有子线程执行完了再继续执行,比如多个子线程并发计算,主线程要用所有子线程计算的结果,或者汇总结果
1、首先wait(0)表示无限等待,直到唤醒;
2、什么东西可以调用wait方法,虽然wait是Object的方法,好像所有的对象都可以调用,但JDK里面的解释已经说了
意思就是说:该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方式的说明,请参阅notify方法;
3、监视器所有权:就是说,当前有那个对象获得了监视器,这个对象就可以执行某些代码片段,直到走完这段代码,释放监视器,也就是锁;
4、获取监视器的对象的线程才能调用wait方法。
当一个主线程里面有个子线程,子线程对象.start()方法,因为start方法加锁了,所以子线程对象获得了监视器,但是这个对象其实是主线程的,所以可以说是主线程获得了监视器,所以只有主线程才能执行wait(0)方法,也就是主线程挂起,释放监视器,这时候t1子线程获得监视器,当他代码执行完了,就会调用notifiyAll()方法唤醒所有的wait线程,之后子线程就释放了监视器,主线程被唤起了,并且得到了CPU分配的分片权限,开始继续执行代码。
个人理解:监视器和对象锁差不多,但是要执行wait和notify方法的线程,哪个线程就需要持有那个有监视器的对象。
个人猜测是这样????
ThreadA.join();这段代码在Main线程中被执行,则Main线程阻塞,ThreadA执行。所以上图说的进入阻塞没问题。只不过应该理解为Main线程阻塞,(即这行语句在哪个线程中执行,谁阻塞)。