wait函数

wait函数会使得到监视器锁的共享对象从运行状态变为挂起,同时会释放这把锁,但是不会释放当前线程其他共享对象上的锁。
以下几个事件可以打断被wait阻塞挂起的状态

  • 其他线程调用的了该共享对象的notify()notifyAll()方法;
  • 其他线程调用了该线程的interrupt()方法,该线程抛出InterruptedException()异常;


    注意:如果该共享对象没有获得监视器锁,直接调用**wait方法会抛出IllegalMonitorStateException**异常

    wait(long timeout)函数

传入timeout时间,当时间到达时,会结束共享对象的阻塞挂起状态
timeout=0 作用和wait()一致
timeout<0 会抛出IllegalArgumentException异常

wait( long timeout, int nanos)函数

在其内部调用的是 wait(long timeout)函数,只有在 nanos>0时才使参数timeout递增1。

notify函数

线程调用共享对象的notify方法,会唤醒该共享变量上被wait阻塞挂起的线程,一个共享变量可能会有多个阻塞挂起的线程,具体唤醒那个线程是随机的。
同时,被唤醒的线程不是立刻就返回执行,而是要和其他线程竞争拿到监视器锁才能执行,否则就处在就绪状态

notifyAll 函数


不同于在共享变量上调用 notify函数会唤醒被阻塞到该共享变量上的一个线程,notifyAll方法则会换唤醒所有在该共享变量上由于调用wait系列方法而被挂起的线程。

join 函数

等待线程执行终止的方法

join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。
join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。(其实join()中调用的是join(0))
join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。

sleep函数

Thread 类中有一个静态的sleep 方法,当一个执行中的线程调用了Thread 的sleep 方法后,调用线程会暂时让出指定时间的执行权,也就是在这期间不参与CPU 的调度,但是该线程所拥有的监视器资源,比如锁还是持有不让出的。指定的睡眠时间到了后该函数会正常返回,线程就处于就绪状态,然后参与CPU 的调度,获取到CPU 资源后就可以继续运行了。
如果在睡眠期间其他线程调用了该线程的interrupt()方法中断了该线程,则该线程会在调用sleep 方法的地方抛出IntermptedException 异常而返回。

yield函数

让出CPU 执行权的方法

当一个线程调用了Thread 类的静态方法yield时,是在告诉线程调度器自己占有的时间片中还没有使用完的部分自己不想使用了,这暗示线程调度器现在就可以进行下一轮的线程调度。当一个线程调用yield 方法时, 当前线程会让出CPU 使用权,然后处于就绪状态,线程调度器会从线程就绪队列里面获取一个线程优先级最高的线程,当然也有可能会调度到刚刚让出CPU 的那个线程来获取CPU 执行权。