黑马程序员技术交流社区
标题:
多线程sleep和wait方法在释放锁和执行权时的不同
[打印本页]
作者:
七宝
时间:
2013-8-16 11:17
标题:
多线程sleep和wait方法在释放锁和执行权时的不同
本帖最后由 七宝 于 2013-8-21 00:53 编辑
首先sleep和wait方法都是多线程中让线程睡眠的方法,用在多线程当中,其中之一的不同点是一个要被唤醒一个自动睡醒
1.为什么sleep方法在Thread线程类当中,而wait在Object类中
2.在释放锁和执行权的时候,这两个方法有什么不同
3.还有没有其他的不同的地方
望大神详细点说明,我对这个感觉比较朦胧,可能没深刻理解吧
作者:
黑马-张明
时间:
2013-8-16 12:09
Java中的多线程是一种抢占式的机制 而不是分时机制。抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行。
共同点: Java中的多线程是一种抢占式的机制 而不是分时机制。抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行。 1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep /join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。
不同点:
1.sleep是Thread类的方法,是线程用来 控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。sleep方法表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程。
wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的.一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生.
2. 每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用.
synchronized(x){
x.notify()
//或者wait()
}
复制代码
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
作者:
神之梦
时间:
2013-8-16 22:05
楼主一点都不淡定
作者:
sunriselzz
时间:
2013-8-20 08:44
1. sleep是Thread类的静态方法,可以放置在程序的任意地方,需要指定以毫秒为单位的时间参数.
2. 在此期间,释放cpu执行权,不释放锁.等过了指定的时间,就会自动自动醒来,重新拥有CPU
执行权,和执行资格,但不一定不会被CPU所执行,而是会到就绪等待执行的队列里等待执行.
3. sleep()方法会抛出InterruptedException异常,需要进行异常捕获.
1. wait() wait是Object类的方法,用来线程间的通信,
2. wait只能在同步控制方法或者同步控制的代码块里面使用,
需要用notify()或者notifyAll()方法, 唤醒该进程.
3. 而一旦对象调用了wait()后,这个线程就会释放CUP执行权,同时释放锁.
Synchronized关键字可以和对象的锁结合使用,来实现线程的同步。
wait(),notify(),notifyAll(),用来操作线程定义在了Object类中的原因:
(1) 这些方法存在与同步中。
(2) 使用这些方法时必须要标识所属的同步的锁。
(3) 锁可以是任意对象,所以任意对象调用的方法一定定义Object类中。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2