sleep()与wait()的区别

来源:互联网 发布:ubuntu flash命令行 编辑:程序博客网 时间:2024/05/21 14:02

1、这两个方法来自不同的类: sleep()是来自Thread类的静态方法,wait()是来自Object类的final方法。

sleep()是让某个线程暂停运行一段时间其控制范围是由当前线程决定的。即在哪个线程内调用该方法,哪个线程就执行sleep()方法:即使在a线程里调用了b的sleep方法,实际上还是a线程去执行该方法。

wait()方法由某个确定的对象来调用的毕竟是来自Object的方法。

两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制(sleep方法),一个是线程之间的通讯的问题(wait方法): java.lang.Thread类中,提供了sleep()。java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程。sleep()可以将一个线程睡眠,参数可以指定一个时间。而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。wait有两种形式wait()和wait(milliseconds).

2、sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(即由Syncronized关键字修饰的代码块或方法)。

sleep告诉操作系统“在未来的多少毫秒内本线程不参与CPU竞争”,在这期间,休眠线程的非同步线程是可以使用休眠线程让出的这部分cpu 进行运行的。但是,因为sleep方法并没有释放锁,所以,休眠线程的同步线程是不能得到执行的。

有一个相关问题:假设现在是12:00:00.000,如果调用一下 Thread.Sleep(1000) ,在 12:00:01.000 的时候,这个线程会不会被唤醒?答案是:不一定。因为你只是告诉操作系统:在未来的1000毫秒内我不想再参与到CPU竞争。那么1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束;况且,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.Sleep(0) ,因为这样就给了其他线程获得CPU控制权的权力,这样界面就不会假死在那里。

wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源

3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 。

Java中,每个对象都只有一个内部锁,并且该锁只有一个内部条件。要运行Synconized关键字声明的方法或者同步块,线程必须获得内部的对象锁。Wait方法添加一个线程到等待集中,notifyAll/nitify方法解除等待线程的阻塞状态。

   synchronized(x){

Wait();

临界区;

      notify();

     //或者wait()

   }

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

原创粉丝点击