• 1.sleep() 休眠
  • 2. suspend () 暂停和 resume() 继续
  • 3.yield() 让步

就是我放弃本次执行,但继续排队,下一次有机会在执行。

  • 4.wait() 和 notify() notifyAll()

注:这两个方法,属于Object类,而不属于Thread类,wait()会先释放锁住的对象,然后再执行等待的动作。由于wait()所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException.

两个方法搭配使用,wait()使线程进入阻塞状态,调用notify()时,线程进入可执行状态。wait()内可加或不加参数,加参数时是以毫秒为单位,当到了指定时间或调用notify()方法时,进入可执行状态。

  • 5.join()

也叫线程加入。是当前线程A调用另一个线程B的join()方法,当前线程转A入阻塞状态,直到线程B运行结束,线程A才由阻塞状态转为可执行状态。

这种方法的使用场景:比如我目前的处理无法继续了,需要另一个状态或者数据的支持,那么可以将支持的监听放到另一个线程中,满足条件,主线程继续,子线程结束。

2.规律总结:

线程就好比排队,你有排队和放弃排队的权力,但你没有立即执行的权力。

suspend和resume是最本质的线程控制方法,其他的方法都是依据这两个方法定制起来的。

  • 1.sleep(5000) 我现在suspend,5000后执行resume;
  • 2.yield()让步,我正办理登机呢,刚拍完照,发现忘记带一个东西了,这时候我让步,但是我取完东西后,会进行下一次排队。
  • 3.join 这里就叫”接合“吧,我把我的线程suspend,开启另一个线程,他执行完的时候,我在resume;
首先,一个 线程 不应该由其他 线程 来强制中断或停止,而是应该由 线程 自己自行停止,自己来决定自己的命运,所以,都已经被废弃了其次,在 Java 中没有办法立即停止一条 线程 ,然而停止 线程 却显得尤为重要,如取消一个耗时操作。因此, Java 提供了一种用于停止 线程 的协商机制----中断,也即中断标识协商机制中断只是一种协作协商机制, Java 没有给中断增加任何语法,中断的过程完全需要程序员自行实现。 两个 方法 搭配使用,wait()使 线程 进入 阻塞 状态,调用notify()时, 线程 进入可执行状态。以上是 Java 线程 唤醒 阻塞 的五种 常用 方法 ,不同的 方法 有不同的特点,其中wait() 和 notify()是其中功能最强大、使用最灵活的 方法 ,但这也导致了它们效率较低、较容易出错的特性,因此,在实际应用中应灵活运用各种 方法 ,以达到期望的目的与效果!是当前 线程 A调用另一个 线程 B的join() 方法 ,当前 线程 转A入 阻塞 状态,直到 线程 B运行结束, 线程 A才由 阻塞 状态转为可执行状态。会使的 线程 放弃当前分得的cpu。 Object类自带的 方法 使用wait() 方法 阻塞 线程 ,使用notify()和notifyAll() 方法 唤醒 线程 。 调用wait() 方法 后, 线程 将被 阻塞 ,wait() 方法 将会释放当前持有的监视器锁(monitor),直到有 线程 调用notify/notifyAll() 方法 后方能继续执行。 notify/notifyAll() 方法 只是解除了等待 线程 阻塞 ,并不会马上释放监视器锁,而是在相应的被synchronized关键字修饰的同步 方法 或同步代码块执行结束后才自动释放锁。 默认使用非公平锁,无法修改。 notify/notifyAll() 方法 只是解除了等待 线程 阻塞 ,并不会马上释放监视器锁,而是在相应的被synchronized关键字修饰的同步 方法 或同步代码块执行结束后才自动释放锁。调用wait() 方法 后, 线程 将被 阻塞 ,wait() 方法 将会释放当前持有的监视器锁(monitor),直到有 线程 调用。需要使用lock对象的newCondition() 方法 获得Condition条件对象(可有多个)。这里有一个许可证的概念,许可不能累积,并且最多只能有一个许可,只有1和0的区别。可实现公平锁,默认是非公平锁。   如果 线程 是因为调用了wait()、sleep()或者join() 方法 而导致的 阻塞 ,可以中断 线程 ,并且通过抛出InterruptedException来 唤醒 它;如果 线程 遇到了IO 阻塞 ,无能为力,因为IO是操作系统实现的, Java 代码并没有办法直接接触到操作系统。以下是详细的 唤醒 方法 :   1. sleep() 方法 sleep(毫秒),指定以毫秒为单位的时间,使 线程 在该时间内进入 线程阻塞 状态,期间得不到cpu的时间片,等到时间过去了, 线程 重新进入可执行状态。(暂停 线程 ,不会释放锁) 两个 方法 搭配使用,wait()使 线程 进入 阻塞 状态,调用notify()时, 线程 进入可执行状态。以上是 Java 线程 唤醒 阻塞 的五种 常用 方法 ,不同的 方法 有不同的特点,其中wait() 和 notify()是其中功能最强大、使用最灵活的 方法 ,但这也导致了它们效率较低、较容易出错的特性,因此,在实际应用中应灵活运用各种 方法 ,以达到期望的目的与效果!sleep(毫秒),指定以毫秒为单位的时间,使 线程 在该时间内进入 线程阻塞 状态,期间得不到cpu的时间片,等到时间过去了, 线程 重新进入可执行状态。(暂停 线程 ,不会释放锁) 两个 方法 搭配使用,wait()使 线程 进入 阻塞 状态,调用notify()时, 线程 进入可执行状态。以上是 Java 线程 唤醒 阻塞 的五种 常用 方法 ,不同的 方法 有不同的特点,其中wait() 和 notify()是其中功能最强大、使用最灵活的 方法 ,但这也导致了它们效率较低、较容易出错的特性,因此,在实际应用中应灵活运用各种 方法 ,以达到期望的目的与效果!sleep(毫秒),指定以毫秒为单位的时间,使 线程 在该时间内进入 线程阻塞 状态,期间得不到cpu的时间片,等到时间过去了, 线程 重新进入可执行状态。(暂停 线程 ,不会释放锁) 在 Java 发展史上曾经使用suspend()、resume() 方法 对于 线程 进行 阻塞 唤醒 ,但随之出现很多问题,比较典型的还是死锁问题。 解决方案可以使用以对象为目标的 阻塞 ,即利用Object类的wait()和notify() 方法 实现 线程阻塞 。 首先,wait、notify 方法 是针对对象的,调用任意对象的wait() 方法 都将导致 线程阻塞 阻塞 的同时也将释放该对象的锁,相应地,调用任意对象的no...