中断处理

Java并发之线程中断

霸气de小男生 提交于 2019-11-28 08:53:00
前面的几篇文章主要介绍了线程的一些最基本的概念,包括线程的间的冲突及其解决办法,以及线程间的协作机制。本篇主要来学习下Java中对线程中断机制的实现。在我们的程序中经常会有一些不达到目的不会退出的线程,例如:我们有一个下载程序线程,该线程在没有下载成功之前是不会退出的,若此时用户觉得下载速度慢,不想下载了,这时就需要用到我们的线程中断机制了,告诉线程,你不要继续执行了,准备好退出吧。当然,线程在不同的状态下遇到中断会产生不同的响应,有点会抛出异常,有的则没有变化,有的则会结束线程。本篇将从以下两个方面来介绍Java中对线程中断机制的具体实现: Java中对线程中断所提供的API支持 线程在不同状态下对于中断所产生的反应 一、Java中对线程中断所提供的API支持 在以前的jdk版本中,我们使用stop方法中断线程,但是现在的jdk版本中已经不再推荐使用该方法了,反而由以下三个方法完成对线程中断的支持。 public boolean isInterrupted() public void interrupt() public static boolean interrupted() 每个线程都一个状态位用于标识当前线程对象是否是中断状态。isInterrupted是一个实例方法,主要用于判断当前线程对象的中断标志位是否被标记了,如果被标记了则返回true表示当前已经被中断

java多线程学习总结

孤街醉人 提交于 2019-11-28 08:10:10
Java 多线程基础总结: 1. 使用 synchronized 关键字 2. 使用 JDK 5 中提供的 java.util.concurrent.lock 包中的 Lock 对象。 一. synchronized 关键字 java 线程同步的基本原理是采用了锁的机制,在 jvm 中,每个对象和类都分配一个锁和它关联,对象锁保护对象的实例变量,类锁其实也是通过对象锁来实现的,通过保护类的 Class 对象,实现锁对类的保护。 如果一个线程获取了某个对象的锁,其他线程就不能再获取该对象的锁了。在 java 程序中,使用 synchronized 块或者 synchronized 方法就可以标识一个同步区域,进入同步区域,需要得到同步区域指定的锁,进入 synchronized 方法需要的对象锁为当前对象,而进入 synchronized 块则需要得到 synchronized 关键字指定的对象的对象锁。一下为使用两者的例子: public synchronized void run() { for (int i = 1; i < 1000; i++) { System.out.println("No." + threadNo + ":" + i); } public void run() { synchronized(lock){ for (int i = 1; i < 1000;

java线程基础知识总结

半城伤御伤魂 提交于 2019-11-28 08:08:39
java线程基础知识总结 什么是线程 线程的简单使用 线程中断 线程状态 线程属性 线程同步 ReentrantLock类 条件锁 注意 synchronized关键字 同步阻塞 volatile关键字 线程局部变量 stop 和suspend方法被弃用原因 阻塞队列 Callable、Future和FutureTask 执行器 ThreadPoolExecutor 什么是线程 一个程序同时执行多个任务,通常每个任务称为一个线程。 进程和线程区别 进程拥有自己的一整套变量体系,而线程则是共享。线程是轻量的,创建撤销的开销小。 线程的简单使用 方式一: //自定义Runnable class MyRunnable implements Runnable { @Override public void run ( ) { //需要处理的任务 } } //创建Runnable对象 Runnable r = new MyRunnable ( ) ; //创建Thread对象 Thread t = new Thread ( r ) ; //启动线程 t . start ( ) ; 方式二 //复写Thread类的run方法 Thread thread = new Thread ( ) { @Override public void run ( ) { //需要做的任务 } } ;

select,poll,epoll最简单的解释

删除回忆录丶 提交于 2019-11-28 05:29:44
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。 epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。 文章核心思想是:要让读者清晰明白 epoll 为什么性能好。 本文会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。 一、从网卡接收数据说起 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构) 下图展示了网卡接收数据的过程。 在 ① 阶段,网卡收到网线传来的数据; 经过 ② 阶段的硬件电路的传输; 最终 ③ 阶段将数据写入到内存中的某个地址上。 这个过程涉及到 DMA 传输、IO 通路选择等硬件有关的知识,但我们只需知道

USB通信协议深入理解

半腔热情 提交于 2019-11-28 05:21:00
0. 基本概念 一个【传输】(控制、批量、中断、等时):由多个【事务】组成; 一个【事务】(IN、OUT、SETUP):由一多个【Packet】组成。 USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。 1. 包(Packet) 包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。数据在 USB总线上的传输以包为单位,包只能在帧内传输。高速USB 总线的帧周期为125us,全速以及低速 USB 总线的帧周期为 1ms。帧的起始由一个特定的包(SOF 包)表示,帧尾为 EOF。EOF不是一个包,而是一种电平状态,EOF期间不允许有数据传输。 注意:虽然高速USB总线和全速/低速USB总线的帧周期不一样,但是SOF包中帧编号的增加速度是一样的,因为在高速USB系统中,SOF包中帧编号实际上取得是计数器的高11位,最低三位作为微帧编号没有使用,因此其帧编号的增加周期也为 1mS USB总线上的情形是怎样的? 包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。

select,poll,epoll最简单的解释

寵の児 提交于 2019-11-28 05:17:09
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。 epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。 文章核心思想是:要让读者清晰明白 epoll 为什么性能好。 本文会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。 一、从网卡接收数据说起 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构) 下图展示了网卡接收数据的过程。 在 ① 阶段,网卡收到网线传来的数据; 经过 ② 阶段的硬件电路的传输; 最终 ③ 阶段将数据写入到内存中的某个地址上。 这个过程涉及到 DMA 传输、IO 通路选择等硬件有关的知识,但我们只需知道

操作系统详解

时光毁灭记忆、已成空白 提交于 2019-11-28 03:28:29
目录 一 为什么要有操作系统 二 什么是操作系统 三 操作系统与普通软件的区别 四 操作系统发展史 五、操作系统原理 1. 操作系统的资源管理技术 2. 系统调用 3. 操作系统内核 4. 处理器状态: 内核态和用户态 5. 中断(Interupt) 6. 进程 7. 处理器调度 8. 进程的交互 9. 临界区管理 10. 信号量(samaphore)和PV操作 11. 管程 12. 死锁 13. 可变分区存储管理 14. 分页存储管理 15. 分段存储管理 16. 虚拟存储管理 17. 请求段页式虚拟内存管理 18. I/O硬件原理:I/O控制方式 19. I/O软件原理 20. 缓冲技术 21. 驱动调度技术 22. 设备独立性 23. 虚拟设备 24. 文件逻辑结构 25. 文件物理结构 二、Q&A 1. 什么是操作系统?操作系统在计算机系统中的主要作用是什么? 2. 什么是多道程序设计?多道程序设计有什么特点? 3. 计算机操作系统为什么引入进程? 4. 在分时系统中,什么是响应时间?它与哪些因素有关? 5. 解释并发性与并行性 6. 试述存储管理的基本功能。 7. 何谓地址转换(重定向)?哪些方法可以实现地址转换? 8. 什么是文件的共享?介绍文件共享的分类和实现思想。 一 为什么要有操作系统 ( 两本书:现代操作系统、操作系统原理,学好python以后再去研究吧~~)

手撕ThreadPoolExecutor线程池源码

柔情痞子 提交于 2019-11-28 02:39:13
这篇文章对ThreadPoolExecutor创建的线程池如何操作线程的生命周期通过源码的方式进行详细解析。通过对execute方法、addWorker方法、Worker类、runWorker方法、getTask方法、processWorkerExit从源码角度详细阐述,文末有彩蛋。 exexcte方法 public void execute(Runnable command) { if (command == null) throw new NullPointerException(); int c = ctl.get(); /** * workerCountOf方法取出低29位的值,表示当前活动的线程数; * 如果当前活动的线程数小于corePoolSize,则新建一个线程放入线程池中,并把该任务放到线程中 */ if (workerCountOf(c) < corePoolSize) { /** * addWorker中的第二个参数表示限制添加线程的数量 是根据据corePoolSize 来判断还是maximumPoolSize来判断; * 如果是ture,根据corePoolSize判断 * 如果是false,根据maximumPoolSize判断 */ if (addWorker(command, true)) return; /** * 如果添加失败,则重新获取ctl值

Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换

ぃ、小莉子 提交于 2019-11-28 01:25:40
  linux操作系统是将CPU轮流分配给任务,分时执行的。而每次执行任务时,CPU需要知道 CPU寄存器 (CPU内置的内存)和 程序计数器PC (CPU正在执行指令和下一条指令的位置)值,这些值是CPU执行任务所依赖的环境,也就是 CPU上下文 。    CPU上下文切换 ,就是把前一个任务的CPU上下文(CPU寄存器和程序计数器)保存起来,然后加载入新任务的上下文到CPU寄存器和程序计数器中,最后跳转到程序计数器所指的位置,运行新任务。   保存下来的上下文会在系统内核中,并在任务重新调度执行时再次加载进来,让任务看起来是连续执行的。   根据任务的不同,CPU上下文切换分为进程上下文切换、线程上下文切换、中断上下文切换。       进程上下文切换   Linux把进程的运行空间分为内核空间和用户空间,并对进程按照 特权等级 划分,从内核空间Ring 0至用户空间Ring 3:Ring 0具有最高权限,可以直接访问所有资源;Ring 3只能访问受限资源,不能直接访问内存等硬件设备,需要通过 系统调用 陷入到内核中,才能访问这些特权资源。      进程运行在用户空间为进程的用户态,陷入内核空间为进程的内核态。从用户态到内核态的转变,需要通过系统调用来完成,期间涉及CPU上下文的切换:先保存原来用户态指令位置,然后更新内核态指令新位置,最后执行内核态代码;系统调用结束后

Linux性能优化从入门到实战:05 CPU篇:硬中断、软中断

╄→гoц情女王★ 提交于 2019-11-28 01:25:14
  软中断(softirq)会导致CPU 使用率升高    中断 是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行。并且当CPU执行在中断处理函数中时,不会响应同时发生的又一次中断。   所以为了加快中断处理程序执行和解决中断丢失的问题,Linux将中断分为上半部和下半部。    上半部 , 硬中断 ,用来 快速处理 中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作,会打断 CPU 正在执行的任务。    下半部 , 软中断 ,用来 延迟处理 上半部未完成的工作,通常由内核触发,以内核线程的方式运行。并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/ ” 。软中断不仅包括硬件处理程序的下半部,还包括一些内核自定义的事件,比如内核调度、RCU 锁(Read-Copy Update)、网络收发、定时等。   如:网卡接收数据的过程。对上半部来说,是把网卡的数据读到内存中,然后更新一下硬件寄存器的状态,再发送一个软中断信号,下半部就从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理