第一种解释: 功能差不多,都用来进行线程控制,他们最大本质的区别是:
sleep()不释放同步锁,wait()释放同步锁.
还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,
如果时间不到你 只能调用 interreput()来强行打断;wait()可以用 notify()直接唤起.
第二种解释: sleep 是 Thread 类的静态方法。
sleep 的作用是让线程休眠制定的时间,在时间到达时恢复,
也就 是说 sleep 将在接到时间到达事件事恢复线程执行,
例如:
try{
System.out.println("I'm going to bed");
Thread.sleep(1000);
System.out.println("I wake up");
} catch(IntrruptedException e) { }
wait 是 Object 的方法,也就是说可以对任意一个对象调用 wait 方法,
调用 wait 方法将会将调用 者的线程挂起,直到其他线程调用同一个对象
的 notify 方法才会重新激活调用者
例如:
//Thread 1
try{
obj.wait(); //suspend thread until obj.notify() is called
}
catch(InterrputedException e)
{ }
第三种解释: 这两者的施加者是有本质区别的.
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,
也就是说,在线程里面决定. 好比如说,我要做的事情是 "点火->烧水->煮面",
而当我点完火之后我不立即烧水,我要休息一段时 间再烧.对于运行的主动权是
由我的流程来控制. 而 wait(),首先,这是由某个确定的对象来调用的,将这个对象
理解成一个传话的人,当这个人在某个线 程里面说"暂停!",也是 thisOBJ.wait(),
这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ 就好
比一个监督我的人站在我旁边,本来该线 程应该执行 1 后执行 2,再执行 3,而在 2 处被那个对象喊暂 停,
那么我就会一直等在这里而不执行 3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直 到那个对象
在某个地方说"通知暂停的线程启动!",也就是 thisOBJ.notify()的时候,那么我就可以煮 饭了,这个被暂停的线程
就会从暂停处 继续执行.
其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,
一个是线程之间 的通讯的问题 在 java.lang.Thread 类中,提供了 sleep(),
而 java.lang.Object 类中提供了 wait(), notify()和 notifyAll()方法来操作线程 sleep()可以将一个线程睡眠,
参数可以指定一个时间。 而 wait()可以将一个线程挂起,直到超时或者该线程被唤醒。 wait 有两种形式
wait()和 wait(milliseconds). sleep 和 wait 的区别有: 1,这两个方法来自不同的类分别是 Thread 和 Object 2,最主要是 sleep 方法没有释放锁,
而 wait 方法释放了锁,使得其他线程可以使用同步控制块或 者方法。 3,wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,
而 sleep 可以在 任何地方使用 synchronized(x){ x.notify() //或者 wait() } 4,sleep 必须捕获异常,而 wait,notify 和 notifyAll 不需要捕获异常
希望对楼主有帮助。 |