sleep() 与 wait()的比较

摘要:
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。sleep可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。

sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

2、最主要sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.

sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒。

3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
synchronized(x){
x.notify()
//或者wait()
}

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

免责声明:文章转载自《sleep() 与 wait()的比较》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Drools介绍与使用php 多个图片合并为一张下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ManualResetEvent 与 AutoResetEvent 的理解和使用

在多线程开发中,时常用到ManualResetEvent 与AutoResetEvent 。 它们如同道路交通中的信号灯。两者之间有什么区别呢? 共同点: 均继承EventWaitHandle 接口,因此,均具有以下功能: Reset() //红灯 Set() //绿灯 WaitOne() // 等待信号 ManualResetEvent mre = ne...

面向对象电梯系列总结

一. 设计策略 1. 架构设计   三个线程:电梯,调度器,主线程(输入线程), 采用worker thread,生产者消费者模式。和同学讨论,发现有的观点认为:调度器更像是一个功能的集合,类似一个函数,不像是一个主体,而且线程越少bug一般而言越少,于是调度器不做为线程。也挺有道理。架构图如下:    其中task使用ConcurrentHashmap...

HBase的Write Ahead Log (WAL) —— 整体架构、线程模型

解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发、持久化的日志保存与回放机制。每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在WAL中。 如果出现HBase服务器宕机,则可以从WAL中回放执行之前没有完成的操作。 本文主要探讨HBase的WAL机制,如何从线程模型、消息机制的层面上,解决这些问题: 1...

15分钟让你了解如何实现并发中的Barrier

说到Barrier,很多语言中已经是标准库中自带的概念,一般情况下,只需要直接使用就行了。而最近一些机缘巧合的机会,我需要在c++中使用这么个玩意儿。但是c++标准库里还没有这个概念,只有boost里面有这样现成的东西,而我又不想为了这么一个小东西引入个boost。所以,我借着这个机会研究了下,发现其实这些多线程/并发中的东西还是蛮有意思的。 阅读本文你可...

31 多线程(四)——线程优先级

优先级概念 线程的优先级可以让线程获得高概率或低概率的cpu调度机会。不是绝对的优先,只是高优先级会被优先调用。 优先级为1-10,最低为1,最高为10,默认为5。可以自行设置值。 设置优先级必需在线程start()之前。 Thread类的优先级常量 MAX_PRIORITY        10 MIN_PRIORITY         1 NORM_...

C# 主线程 辅助线程

主线程:就是UI线程;从主线程通过Thread.Start或AsyncDelegate.BeginEnvoke(可带参数、定义回调方法、避免轮询)将进入辅助线程;采用异步的方式调用委托可以在界面重绘时避免工作线程被阻塞;从主线程中调用委托的AsyncDelegate.EndEnvoke方法将进入辅助线程(EndInvoke()是阻塞方法,在回调方法中调用E...