-
1.sleep() 休眠
-
2.
suspend
() 暂停和 resume() 继续
-
3.yield() 让步
就是我放弃本次执行,但继续排队,下一次有机会在执行。
-
4.wait() 和 notify() notifyAll()
注:这两个方法,属于Object类,而不属于Thread类,wait()会先释放锁住的对象,然后再执行等待的动作。由于wait()所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException.
两个方法搭配使用,wait()使线程进入阻塞状态,调用notify()时,线程进入可执行状态。wait()内可加或不加参数,加参数时是以毫秒为单位,当到了指定时间或调用notify()方法时,进入可执行状态。
也叫线程加入。是当前线程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...