黑马程序员技术交流社区

标题: 多线程sleep和wait方法在释放锁和执行权时的不同 [打印本页]

作者: 七宝    时间: 2013-8-16 11:16
标题: 多线程sleep和wait方法在释放锁和执行权时的不同
本帖最后由 七宝 于 2013-8-17 00:30 编辑

首先sleep和wait方法都是多线程中让线程睡眠的方法,用在多线程当中,其中之一的不同点是一个要被唤醒一个自动睡醒
1.为什么sleep方法在Thread线程类当中,而wait在Object类中
2.在释放锁和执行权的时候,这两个方法有什么不同
3.还有没有其他的不同的地方
望大神详细点说明,我对这个感觉比较朦胧,可能没深刻理解吧

作者: 黑马-张明    时间: 2013-8-16 12:11
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可以在任何地方使用.
  1. synchronized(x){
  2.   x.notify()
  3.   //或者wait()
  4.   }
复制代码
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常   
作者: py强子    时间: 2013-8-16 14:02
本帖最后由 py强子 于 2013-8-16 14:08 编辑

1.为什么sleep方法在Thread线程类当中,而wait在Object类中?
         因为sleep()是让当前线程休眠相应时间;所以属于Thread类;
         
       wait(),notify();notifyAll();

   因为这些方法在操作同步中线程时,都必须要标识它们所操作线程持有的锁,
   只有同一个锁上的被等待线程。可以被同一个锁上notify唤醒,
   不可以对不同锁中的线程进行唤醒,
   也就是说,等待和唤醒必须是同一个锁,
   而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中

2.在释放锁和执行权的时候,这两个方法有什么不同;
      sleep();是根据时间去执行,时间到,该线程就获得了执行权;
    而wait();是必须由notify()去唤醒,如果没有notify(),该线程将一直等下去;
     该方法是很好的一个内存泄露问题;


作者: 神之梦    时间: 2013-8-16 22:06
还发两遍      
作者: 七宝    时间: 2013-8-16 22:23
神之梦 发表于 2013-8-16 22:06
还发两遍

楼主 这是个意外 不小心发两遍的





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2