需要注意以下几点: 1. 在执行notify()或notifyAll()方法后,当前线程不会马上释放该对象锁,需要等到notify()或notifyAll()方法所在的同步方法或同步代码块执行完成,当前线程才会释放锁。 2. 在sleep()状态下interrupt()中断线程,会进入catch语句,并且清除停止状态值,使之变成false。 3. wait(long)方法:如果线程在指定时间(long)内未被唤醒,则自动唤醒。wait(0)等价于wait()。 4. Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
作用:使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,直到线程x执行完成之后(销毁后)再继续执行线程z后面的代码。 join方法具有使线程排队运行的作用,有些类似同步的运行效果。join与synchronized的区别是: join:在内部使用wait()方法进行等待 synchronized:使用的是“对象监视器”原理作为同步
join与异常: 在join使用过程中,如果当前线程对象z被中断,则当前线程z出现异常。
join(long)中的参数是设定等待时间。
join(long)与sleep(long)的区别 : join(long)的功能在内部使用wait(long)方法来实现的,所以join(long)方法 具有释放锁的特点 ,sleep()方法 不具有释放锁的特点
join(long)源代码如下 :
public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { //获取当前线程执行状态的值,如果此线程已经开始但尚未正常终止,则为 true,否则为 false。 long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } } 注意:join()无参形式等价于join(0),wait()类似
原文链接:https://blog.csdn.net/u011296485/article/details/77914205?utm_medium=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase