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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© nihaoshitou 中级黑马   /  2013-5-10 22:23  /  1858 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 nihaoshitou 于 2013-5-11 22:30 编辑

wait与sleep的区别,小弟刚刚学习对这块不太明白,望大神指点一二!谢了!

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

19 个回复

倒序浏览
你好,java多线程中的sleep和wait方法都是用于让对象进入冻结状态的。
只不过sleep(毫秒值)只要等事先设置的时间到了就自动醒了。
而wait()就不会,wait()需要人手动唤醒它它才会重新回到运行状态或者阻塞状态。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
  synchronized(x)
{x.notify()
//或者wait()
}
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
1,wait()自愿放弃同步锁资源,使得其他线程可以使用同步控制块或者方法;
而sleep()没有释放同步锁。
2,使用方式不同:
sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;   
wait()可以用notify()直接唤起。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用;
而sleep可以在任何地方使用。
4,sleep是Thread类的静态方法,,在java.lang.Thread类中,提供了sleep()。sleep()可以将一个线程睡眠,参数可以指定一个时间。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。
wait是Object的方法,而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程。wait()可以将一个线程挂起,直到超时或者该线程被唤醒。也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1 继续努力哈,25分马上到手。

查看全部评分

回复 使用道具 举报
|--sleep
   Thread.sleep(long times);一个线程进来了,运行到这句,会会自动休眠一下的时间,但是如果是就它一个线程,不会影响它的执行结果。也就是说,它就是在这里休息一下,接着就往下做
|--wait
   这个地方用张老师的话给你总结一下吧。
要求如下:子线程先循环10次,然后主线程循环100次,然后子线程循环10次,接着主线程循环100次......如此往复50次。
一、
分析:程序中一共有两个线程:子线程和主线程
子线程先循环10次,然后一共做50次这样的操作
主线程先循环100次,也是一共做50次这样的操作


public class TraditionalThreadCommunication {

        public static void main(String []args){
               
                final Business business = new Business();
                new Thread(new Runnable() {
               
                        public void run() {
                                for(int i=1;i<=50;i++){
                                       
                                        /*
                                         * 线程间同步的一种房: 让两个线程sleep时间不同,也可以达到同步
                                         * 2、wait()  ,notify();
                                         *
                                         */
                                        /*try {
                                                Thread.sleep(90l);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }*/
                                        business.sub(i);
                                }
                        }
                }).start();
               
               
               
                for(int i=1;i<=50;i++){
                        /*try {
                                Thread.sleep(100l);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }*/
                        business.main(i);
                }
        }
       
       
        static class Business{
               
                private boolean bShould = true;
                public synchronized void sub(int i){
                        if(!bShould)
                                try {
                                        wait();
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                       
                        for(int j=1;j<=10;j++){
                                System.out.println("Sub thread sequece of "+j+" ,loop of "+i);
                        }
                       
                        bShould = false;
                        notify();
                }
               
                public synchronized void main(int i){
                        if(bShould)
                                try {
                                        wait();
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        for(int j=1;j<=100;j++){
                                System.out.println("main thread sequece of "+j+" ,loop of "+i);
                        }
                       
                        bShould = true;
                        notify();
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1 辛苦了```

查看全部评分

回复 使用道具 举报
楼上的都回答完了,找点金币,,,
回复 使用道具 举报
学习了。呵呵
回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
eycrckag 来自手机 中级黑马 2013-5-11 20:28:47
9#
wait需要 notify()和notifyAll()方法来叫醒。sleep时间到了。自然醒
回复 使用道具 举报
学习 学习
回复 使用道具 举报
伤心成版主了  {:soso_e142:}
回复 使用道具 举报
简单来说:wait()等待状态时,是需要重新唤醒,而且重新唤醒后需要得到CPU的使用权才能进入运行状态,
sleep()睡眠状态在括号里面给定了具体时间后,在这个规定时间之后不需要唤醒,只要在这个睡眠时间之后
获得了CPU的使用权,就能自动进入运行状态。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
加一句,如果要从底层区别,楼上已经说得很详细了。
回复 使用道具 举报
赵崇友 发表于 2013-5-11 22:13
伤心成版主了

嘿嘿```..
回复 使用道具 举报
殇_心。 发表于 2013-5-11 22:29
嘿嘿```..

呵呵 ,混的不赖!!  你现在在黑马?
回复 使用道具 举报
赵崇友 发表于 2013-5-11 22:34
呵呵 ,混的不赖!!  你现在在黑马?

还没进。。。 准备进。
回复 使用道具 举报
殇_心。 发表于 2013-5-11 22:38
还没进。。。 准备进。

准备进20期的?找个基友呀
回复 使用道具 举报
赵崇友 发表于 2013-5-11 22:43
准备进20期的?找个基友呀

不是。。 21期的
回复 使用道具 举报
殇_心。 发表于 2013-5-11 22:44
不是。。 21期的

啊,好吧!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马