黑马程序员技术交流社区

标题: 多线程中的小问题求大神指点 [打印本页]

作者: nihaoshitou    时间: 2013-5-10 22:23
标题: 多线程中的小问题求大神指点
本帖最后由 nihaoshitou 于 2013-5-11 22:30 编辑

wait与sleep的区别,小弟刚刚学习对这块不太明白,望大神指点一二!谢了!
作者: 黑马-雷钊    时间: 2013-5-10 22:41
你好,java多线程中的sleep和wait方法都是用于让对象进入冻结状态的。
只不过sleep(毫秒值)只要等事先设置的时间到了就自动醒了。
而wait()就不会,wait()需要人手动唤醒它它才会重新回到运行状态或者阻塞状态。
作者: 王林涛    时间: 2013-5-10 23:09
1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
  synchronized(x)
{x.notify()
//或者wait()
}
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

作者: 孤独的鸟人    时间: 2013-5-10 23:38
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方法才会重新激活调用者。

作者: Super_Class    时间: 2013-5-10 23:48
|--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();
                }
        }
}

作者: 、__WSD吴少东    时间: 2013-5-11 00:20
楼上的都回答完了,找点金币,,,
作者: 小陈期待逆袭    时间: 2013-5-11 13:31
学习了。呵呵
作者: 殇_心。    时间: 2013-5-11 14:26
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
作者: eycrckag    时间: 2013-5-11 20:28
wait需要 notify()和notifyAll()方法来叫醒。sleep时间到了。自然醒
作者: 梁海君    时间: 2013-5-11 20:55
学习 学习
作者: 赵崇友    时间: 2013-5-11 22:13
伤心成版主了  {:soso_e142:}
作者: 杨修    时间: 2013-5-11 22:14
简单来说:wait()等待状态时,是需要重新唤醒,而且重新唤醒后需要得到CPU的使用权才能进入运行状态,
sleep()睡眠状态在括号里面给定了具体时间后,在这个规定时间之后不需要唤醒,只要在这个睡眠时间之后
获得了CPU的使用权,就能自动进入运行状态。
作者: 杨修    时间: 2013-5-11 22:15
加一句,如果要从底层区别,楼上已经说得很详细了。
作者: 殇_心。    时间: 2013-5-11 22:29
赵崇友 发表于 2013-5-11 22:13
伤心成版主了

嘿嘿```..
作者: 赵崇友    时间: 2013-5-11 22:34
殇_心。 发表于 2013-5-11 22:29
嘿嘿```..

呵呵 ,混的不赖!!  你现在在黑马?
作者: 殇_心。    时间: 2013-5-11 22:38
赵崇友 发表于 2013-5-11 22:34
呵呵 ,混的不赖!!  你现在在黑马?

还没进。。。 准备进。
作者: 赵崇友    时间: 2013-5-11 22:43
殇_心。 发表于 2013-5-11 22:38
还没进。。。 准备进。

准备进20期的?找个基友呀
作者: 殇_心。    时间: 2013-5-11 22:44
赵崇友 发表于 2013-5-11 22:43
准备进20期的?找个基友呀

不是。。 21期的
作者: 赵崇友    时间: 2013-5-11 22:57
殇_心。 发表于 2013-5-11 22:44
不是。。 21期的

啊,好吧!!!




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