中断处理

协作,才能更好的中断线程

淺唱寂寞╮ 提交于 2019-11-30 23:15:23
聊起中断,大家可能最熟悉的例子就是线程休眠。下面就是一个线程休眠的 demo,在这个例子中,当我们调用 sleep 方法,该方法将会抛出一个需要捕获的中断异常,这里捕获该异常并直接返回。 for (int i = 0; i < somethings.size(); i++) { // 休眠 4 s try { Thread.sleep(4000); } catch (InterruptedException e) { // 抛出中断异常 return; } // 输出 System.out.println(somethings.get(i)); } 除了 InterruptedException 中断异常,另外还有三个中断相关的方法,三个方法都与线程相关。 thread#interrupt Thread#interrupted thread#isInterrupted interrupt 方法用于中断线程,但是并不是说该方法就能 直接使线程停止 。 下面使用 interrupt 中断线程,这里我们期望中断直接停止子线程输出。但是当主线程调用子线程 interrupt 方法,子线程并却没有被终止,还在继续打印数字。 Runnable interruptedTask=new Runnable() { @Override public void run() { for (int i =

二十三、并发编程之深入解析Condition源码

风格不统一 提交于 2019-11-30 22:34:29
二十三、并发编程之深入解析Condition源码 一、Condition简介 1、Object的wait和notify/notifyAll方法与Condition区别 任何一个java对象都继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制。在java Lock体系下也有方法实现等待/通知机制。从整体上来看Object的wait/notify是与对象监视器配合完成线程间的等待/通知机制,而Condition是与Lock配合完成等待通知机制,前者是java底层级别的,后者是语言级别的,具有更高的可控制性和扩展性。 两者除了在使用方式上不同外,在功能特性上还是有很多的不同: 1.Condition能够支持不响应中断,而Object的wait/notify不支持; 2.Condition能够支持多个等待队列(new多个Condition对象),而Object的wait/notify只能支持一个; 3.Condition能够支持超时时间的设置,而Object的wait/notify不支持 2、参照Object的wait和notify/notifyAll方法

linux之网络

风格不统一 提交于 2019-11-30 22:27:38
你想通过执行ping google.com来判断网络连通性么? 由于 nio 的普及, ck10k 的问题已经成为过去式。现在随便一台服务器,就可以支持数十万级别的连接了。那么我们来算一下,100万的连接需要多少资源。 首先,每一个连接都是文件句柄,所以需要文件描述符数量支持才行,每一个socket内存占用15k-20k之间,这样,仅维护相应socket,就需要 20G 内存;而广播一个1KB的消息需要占用的带宽为 1000M ! 查看当前系统的连接 如何看当前系统有多少连接呢?可以使用 netstat 结合 awk 进行统计。如下脚本,统计了每一种状态的tcp连接数量 # netstat -antp | awk '{a[$6]++}END{ for(x in a)print x,a[x]}' LISTEN 41 CLOSE_WAIT 24 ESTABLISHED 150 Foreign 1 TIME_WAIT 92 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' ( netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ TIME_WAIT 8947 等待足够的时间以确保远程TCP接收到连接中断请求的确认

8086汇编 端口 以及外部中断

家住魔仙堡 提交于 2019-11-30 22:19:05
在PC机系统中,和CPU通过总线连接的芯片除了各种存储器外,还有以下3种芯片: 1,各种接口卡(网卡,显卡)上的接口芯片 2,主板上的接口芯片,CPU通过访问他们对部分外设进行访问 3,其他芯片,用来储存相关的系统信息 这些芯片中,都是一组可以由CPU读写的寄存器。这些芯片上的寄存器就是端口。 从CPU角度来看,将这些寄存器(三组芯片中的)都当做端口,对它们进行统一编址,从而建立了一个统一的端口地址空间,每个端口在空间中都有一个地址。 在PC中,端口地址范围为0~65535,可以最多定义64K个不同的端口。 CPU可以直接读写三个地方上的数据: CPU内部的寄存器、内存单元、端口 由于端口是一个独立的存在,他们有他们的端口地址空间,所以对端口的访问,我们不能还是通过mov这样的指令了,我们通过 in , out 指令。比如: in al, 60h; 就是我们从60h这个端口读取一个字节到al寄存器中去。 注意:只能使用al,或者ax从储存从端口获取的内容。 shl , shr 指令: 移位,进位的那位储存在CF中,补位为0 现在考虑一个问题,比如我们通过键盘输入一个字符进入PC,那么CPU是如何知道我们输入了的呢? 这里就是中断起作用了,CPU在每执行完一个指令后,会检查IF标志位,如果是1,则表明了有一个外部中断来了,然后cpu开始处理外部中断了,这和前面讲的处理内部中断一样

STM32学习笔记一一USART

走远了吗. 提交于 2019-11-30 18:15:54
前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。 1.串口的基本概念 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的DMA方式,可以实现高速数据通信。 2.串口通信连接 接口通过三个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。 RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。 TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时, TX引脚处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。 3.串口设置的一般步骤 对于复用功能的 IO,我们首先要使能 GPIO 时钟,然后使能复用功能时钟,同时要把 GPIO 模式设置为复用功能对应的模式,串口参数的初始化设置,包括波特率,停止位等等参数。在设置完成后就是使能串口。同时

APP功能测试要点

試著忘記壹切 提交于 2019-11-30 14:32:21
APP功能测试要点 1、 功能性测试 根据产品需求文档编写测试用例而进行测试,包括客户端的单个功能模块以及功能业务逻辑(功能交互)如:涉及输入的地方需要考虑等价类,边界值,异常或非法等 1.1 安装与卸载测试 >软件安装后是否可以正常运行 >安装过程中是否可以取消 >安装空间不足时是否有相应提示 >是否可以卸载应用(可通过桌面卸载,也可以通过软件卸载安装) >卸载是否支持取消功能,单击取消后软件卸载功能是否正常===不可逆 >卸载后文件是否全部删除所有的安装文件夹 >安装到本地还是SD卡,有选择可以提供 >安装完自动删除安装包 >从不同的应用市场下载进行安装?---安卓端 >重复安装 1.2 软件升级测试 >当客户端有新版本时,是否有更新提示 >当版本为非强制升级时,用户可以取消更新,老版本能正常使用,用户在下次启动app时仍能出现更新提示 >当版本为强制升级时,当给出强制更新后用户没有做更新时,退出客户端,下次启动app时仍能出现强制升级提示(没有取消按钮) >检查更新后各个功能是否正常使用 >在线跨版本升级后是否正常使用 ---问题:版本升级测试是全部测试还是部分测试? >关于新版本的更新内容:1.新功能 2.修复bug、优化模块 先测试更新的内容,再在发布之前走一下基本功能 1.3 登录测试 >1)账号密码登录 2)第三方登录 3)指纹登录 4)手势密码登录 5)快捷登录 6

Java面试-interrupt

…衆ロ難τιáo~ 提交于 2019-11-30 12:21:46
我们都知道,Java中停止一个线程不能用 stop ,因为 stop 会瞬间强行停止一个线程,且该线程持有的锁并不能释放。大家多习惯于用 interrupt ,那么使用它又有什么需要注意的呢? interrupt相关的方法 Java中和interrupt相关的方法有三个 public boolean isInterrupted() public void interrupt() public static boolean interrupted() boolean isInterrupted() 每个线程都一个状态位用于标识当前线程对象是否是中断状态。 isInterrupted 主要用于判断当前线程对象的中断标志位是否被标记了,如果被标记了则返回true,表示当前已经被中断,否则返回false。我们也可以看看它的实现源码: public boolean isInterrupted() { return isInterrupted(false); } private native boolean isInterrupted(boolean ClearInterrupted); 底层调用的native方法 isInterrupted ,传入一个boolean类型的参数,用于指定调用该方法之后是否需要清除该线程的中断标识位。从这里我们也可以看出来,调用 isInterrupted()

STM32外部中断小结

烂漫一生 提交于 2019-11-30 11:49:21
外部中断 在STM32中,每个IO脚都可以作为外部中断的输入脚。 但是一个饮片不可能配置相同数量的中断线,来接收IO的状态( 上升,下拉,速度等 ),所以, 怎么使中断线和大数量的IO脚进行配对呢? 如上图所示的中断线配置相对应的IO脚,中断线的数量将大幅度的减少。 外部中断的一般配置方法 1、既然是对IO脚线配置,那IO脚的时钟是第一个需要配置的。 __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 __HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟 __HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟 2、配置好IO脚的时钟之后,接着是需要配置IO脚的状态。 (上升,下拉,速度等) 是配置IO脚的状态,需要用到 HAL_GPIO_Init(GPIOA,&GPIO_Initure); 这个函数 GPIO_Initure.Pin=GPIO_PIN_0; //PA0 GPIO_Initure.Mode=GPIO_MODE_IT_RISING; // GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速 HAL_GPIO_Init(GPIOA,&GPIO_Initure); 3

【转帖】Linux 内核系统架构

孤街浪徒 提交于 2019-11-30 06:21:18
Linux 内核系统架构 描述Linux内核的文章已经有上亿字了 但是对于初学者,还是应该多学习多看,毕竟上亿字不能一下子就明白的。 即使看了所有的Linux 内核文章,估计也还不是很明白,这时候,还是需要fucking the code. 28年前(1991年8月26日)Linus公开Linux的代码,开启了一个伟大的时代。这篇文章从进程调度,内存管理,设备驱动,文件系统,网络等方面讲解Linux内核系统架构。Linux的系统架构是一个经典的设计,它优秀的分层和模块化,融合了数量繁多的设备和不同的物理架构,让世界各地的内核开发者能够高效并行工作。先来看看Linus在多年前公开Linux的邮件。 "Hello everybody out there using minix - I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I’d like any feedback on things people like/dislike in minix, as my OS

TCP/IP协议学习——传输层的TCP协议

匆匆过客 提交于 2019-11-30 03:26:00
IP协议是通过IP地址来进行定位寻址的,IP地址用来确定要将数据发送给那一台主机;而TCP与UDP协议中则是通过主机端口号来进行确定在主机上的那个应用程序来收发数据。 1. TCP协议提供的服务 1. TCP与UDP都基于网络层的IP协议,但是为应用层提供了完全不同的服务。 TCP提供了面向连接的、可靠的字节流服务 。面向连接表示在客户端与服务端的两个使用TCP协议的应用程序之间需要首先建立起一个TCP连接,然后才能进行交互数据,而且TCP中也只能进行两个主机之间的通信,无法实现多播和广播。 2. TCP协议保证数据传输可靠性的方式: (1)应用层传来的数据将被TCP协议分割为合适长度的数据块,这个传递给网络层IP协议处理的数据块被称为报文段。 (2)当TCP发出一个报文段,就会启动一个定时器,等待目的端确认接收该报文段,如果无法在定时器结束前接收确认消息,就会重发报文段。 (3)当一段的TCP收到另一端发送的数据时,就会响应一个确认消息。 (4)TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段并且不确认收到此报文段(希望发端超时并重发)。 (5)既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要