Thread 常搞混的几个概念sleep、wait、yield、interrupt (转)

原文网址:http://blog.csdn.net/partner4java/article/details/7993420sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。
通过调用sleep使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行。
调用sleep的时候锁并没有被释放。
Java SE5引入了更加显示的sleep()版本作为TimeUnit类的一部分,这个方法允许你指定sleep()延迟的时间单元,因此可以提供更好的可阅读性。TimeUnit还可以被用来执行转换,就想稍后你会在本书中看到的那样。

wait:调用wait使线程挂起,知道线程得到了notify或notifyAll消息,线程才会进入就绪状态。
使你可以等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力。
线程的执行被挂起,对象上的锁被释放。意味着另一个任务可以获得这个锁。因此在改对象中的其他synchronized方法可以在wait期间被调用。
就意味着生命“我已经刚刚做完能做的所有事情,因此我要在这里等待,但是我希望其他synchronized操作在条件适合的情况下才能够执行”
yield:如果知道已经完成了在run()方法的循环的一次迭代过程中所需要的工作,就可以给线程调度一个机制暗示:我的工作已经做的差不多了,可以让给别的线程使用CPU了。通过调用yield()来实现。
当调用yield时,你也是在建议具有相同优先级的其他线程可以运行。
对于任何重要的控制或在调整应用时,都不恩那个依赖于yield。实际上,yield经常被误用。
(yield并不意味着退出和暂停,只是,告诉线程调度如果有人需要,可以先拿去,我过会再执行,没人需要,我继续执行)
调用yield的时候锁并没有被释放。

interrupt:中断线程

Thread.interrupt()或者新类库里面通过Executor的submit()来获得Future<?>返回值,这个Future提供cancel()以停止这个线程。

Thread类包含interrupt()方法,因此你可以终于被阻塞的任务,这个方法将设置线程的中断状态。如果一个线程已经被阻塞,或者视图执行一个
阻塞操作,那么设置这个线程的终端状态将抛出InterruptedException。当抛出该异常或者该任何调用
Thread.interrupted()时,中断状态将复位。
你在Executor上调用shutdownNow(),那么它将发送一个interrupt()调用给他启动的所有线程。

时间: 2024-12-23 23:52:37

Thread 常搞混的几个概念sleep、wait、yield、interrupt (转)的相关文章

关于开发Windows服务程序容易搞混的地方!

在开发Windows服务程序时,我们一般需要添加安装程序,即:serviceInstaller,里面有几个关于名称属性,你都搞明白了吗? 1.Description:表示服务说明(描述服务是干什么的): 2.DisplayName:表示友好名称,可以理解为服务名的别名: 3.ServiceName:表示服务名,此为真正的服务名,与DisplayName是有区别的哦,是系统识别的依据: 这三个属性在WIN7及更高版本操作系统中,同属性但表示却不同: 本地服务列表中:(即:services.msc)

固态硬盘的PCIE,SATA,M2,NVMe,AHCI分别都指什么?别再搞混了

原文:https://baijiahao.baidu.com/s?id=1616207956596122967&wfr=spider&for=pc 科技娱乐屋 18-11-0420:54 固态硬盘近年来也是随着计算机的发展而得到了迅速的发展,目前已经隐隐有要取代机械硬盘的势头,只要成本价格控制下来,相信取代机械硬盘也只是时间问题 但是关于固态硬盘的概念实在是太繁琐了,很多人选购固态时也是看到商家宣传NVMe,PCIE固态却不懂到底是什么意思,今天我们就来为大家详解这些都是什么东西 首先我们

那些年搞不懂的术语、概念:协变、逆变、不变体

简述什么是协变性.逆变性.不变性 协变性,如:string->object (子类到父类的转换) 逆变性,如:object->string (父类到子类的转换) 不变性,基于上面两种情况,不可变.具体下面再做分析. 泛型委托的可变性 先使用框架定义的泛型委托Func和Action做例子(不了解的请戳) 协变:(string->object) Func<string> func1 = () => "农码一生"; Func<object> f

Java随笔:容易搞混的long常量

看看这句代码输出什么: System.out.println(12345+5432l); 乍看上去是:66666,实际输出的结果是17777. 原因出在“5432l”最后一个是字母L的小写. 要避免这样的情况,在使用long常量时,一定记得要用L大写.

WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误

今天用C# 连接Redis做性能测试,用的接口是StackExchange.Redis,按照正常的思路获取数据库连接,代码如下: 1 string conn = "我的ip:6379,password=登录密码"; 2 3 ConnectionMultiplexer client = ConnectionMultiplexer.Connect(conn); 4 5 IDatabase db = client.GetDatabase(2); 然后就向里边添加数据,类似的代码如下: 1 R

差一点搞混了Transactional注解

今天给我的Srping业务层加如下Service和Transactional注解: @Service @Scope(BeanDefinition.SCOPE_SINGLETON) @Transactional(propagation=Propagation.REQUIRED, timeout=600, rollbackFor=Exception.class)   结果总是不认propagation.timeout和rollbackFor,后来才发现我引入类定义错了,本来应该用Spring的org

hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混

先贴出异常 Struts has detected an unhandled exception: Messages: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1 File: org/hibernate/engine/query/spi/ParameterMetadata.java Stacktraces org.h

C/C++比较容易搞混的一些写法

#include <stdio.h> int main() { int a = 101; char ch = *(char *)&a; //*(char *)&a:含义就是先取a的首地址, 然后强制转换为char指针类型, 然后取该指针的值. printf("%c\n", ch); system("pause"); return 0; }

一些容易搞混的问题

可变和不可变数据类型 基本数据类型都是不可变数据类型 数字,字符串,布尔值+(元祖) 数据结构(容器)都是可变数据类型 列表,字典,集合 不同下划线变量的含义 _单下划线开头:弱"内部使用"标识,如:"from M import *",将不导入所有以下划线开头的对象,包括包.模块.成员 __双下划线开头:模块内的成员,表示私有成员,外部无法直接调用 __双下划线开头双下划线结尾__:指那些包含在用户无法控制的命名空间中的"魔术"对象或属性,如类成