A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 七宝 于 2013-8-21 00:53 编辑

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

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

4 个回复

倒序浏览
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不需要捕获异常   

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
楼主一点都不淡定
回复 使用道具 举报
      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类中。
       
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马