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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

战马

初级黑马

  • 黑马币:0

  • 帖子:12

  • 精华:0

© 战马 初级黑马   /  2013-10-26 22:20  /  1323 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

wait和sleep都有哪些区别呀?希望能具体点

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
sleep()方法和wait()方法都成产生让当前运行的线程停止运行的效果,这是它们的共同点。下面我们来详细说说它们的不同之处。

sleep()方法是本地方法,属于Thread类,它有两种定义:

  1. [java] view plaincopyprint?
  2. 01.public static native void sleep(long millis) throws InterruptedException;  
  3. 02.public static void sleep(long millis, int nanos) throws InterruptedException {  
  4. 03.    //other code  
  5. 04.}  
复制代码
其中的参数millis代表毫秒数(千分之一秒),nanos代表纳秒数(十亿分之一秒)。这两个方法都可以让调用它的线程沉睡(停止运行)指定的时间,到了这个时间,线程就会自动醒来,变为可运行状态(RUNNABLE),但这并不表示它马上就会被运行,因为线程调度机制恢复线程的运行也需要时间。调用sleep()方法并不会让线程释放它所持有的同步锁;而且在这期间它也不会阻碍其它线程的运行。上面的连个方法都声明抛出一个InterruptedException类型的异常,这是因为线程在sleep()期间,有可能被持有它的引用的其它线程调用它的interrupt()方法而中断。中断一个线程会导致一个InterruptedException异常的产生,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。

为了更好地理解interrupt()效果,我们来看一下下面这个例子:
  1. [java] view plaincopyprint?
  2. 01.public class InterruptTest {  
  3. 02.    public static void main(String[] args) {  
  4. 03.        Thread t = new Thread() {  
  5. 04.            public void run() {  
  6. 05.                try {  
  7. 06.                    System.out.println("我被执行了-在sleep()方法前");  
  8. 07.                    // 停止运行10分钟  
  9. 08.                    Thread.sleep(1000 * 60 * 60 * 10);  
  10. 09.                    System.out.println("我被执行了-在sleep()方法后");  
  11. 10.                } catch (InterruptedException e) {  
  12. 11.                    System.out.println("我被执行了-在catch语句块中");  
  13. 12.                }  
  14. 13.                System.out.println("我被执行了-在try{}语句块后");  
  15. 14.            }  
  16. 15.        };  
  17. 16.        // 启动线程  
  18. 17.        t.start();  
  19. 18.        // 在sleep()结束前中断它  
  20. 19.        t.interrupt();  
  21. 20.    }  
  22. 21.}  
复制代码
运行结果:

  • 我被执行了-在sleep()方法前
  • 我被执行了-在catch语句块中
  • 我被执行了-在try{}语句块后

wait()方法也是本地方法,属于Object类,有三个定义:

  1. [java] view plaincopyprint?
  2. 01.public final void wait() throws InterruptedException {  
  3. 02.    //do something  
  4. 03.}  
  5. 04.public final native void wait(long timeout) throws InterruptedException;  
  6. 05.public final void wait(long timeout, int nanos) throws InterruptedException {  
  7. 06.    //do something  
  8. 07.}  
复制代码
wari()和wait(long timeout,int nanos)方法都是基于wait(long timeout)方法实现的。同样地,timeout代表毫秒数,nanos代表纳秒数。当调用了某个对象的wait()方法时,当前运行的线程就会转入等待状态(WAITING),等待别的线程再次调用这个对象的notify()或者notifyAll()方法(这两个方法也是本地方法)唤醒它,或者到了指定的最大等待时间,线程自动醒来。如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法同样会被Thread类的interrupt()方法中断,并产生一个InterruptedException异常,效果同sleep()方法被中断一样。

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
1,wait不用指定参数,sleep需要制定参数。2,当线程调用了wait方法时,线程会处于等待状态,需要另一条线程notify或notifall。3,当线程遇到sleep方法,不释放锁,继续持有锁。
回复 使用道具 举报
sleep()和wait()的区别:
         (1)这两个方法来自不同的类,sleep()来自Thread类,和wait()来自Object类。
         (2)sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,
            要让b线程睡觉要在b的代码中调用sleep。而wait()是Object类的非静态方法
         (3)sleep()释放资源不释放锁,而wait()释放资源释放锁;
         (4)使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,
sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleep

sleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,wait(100L)是进入等待池中等待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同的是其他在等待池中的线程不被notify不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-27 16:23:48
地板
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马