# zb_java20190419 **Repository Path**: climpeaker/zb_java20190419 ## Basic Information - **Project Name**: zb_java20190419 - **Description**: 多线程 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-04-19 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # zb_java20190419 #### 介绍 多线程 #### 课堂笔记 1. 进程和线程概念 ``` 1.1 进程 进程是操作系统中为完成一定的数据处理任务而运行的程序; 进程:就是运行中的程序,进程运行时需要使用数据; 进程=程序+数据; 进程是操作系统进行资源分配的基本单位; 进程是可以保持占有系统资源的(操作系统的核心资源是cpu) 进程具有动态性、并发性、独立性、异步性等特性; 进程是动态的; 程序是静态的; 并发执行和同时执行: 并发执行是指在一个时间段内同时执行; 在一个时间段内并发的进程或者线程是交替执行的;但是从一个时间段内看,是同时执行; 同时执行是指在一个时间点同时执行; 1.2 进程的状态 进程在操作系统中执行时会有9状态的转换过程; 掌握进程三态、五态的状态转换图; 三态: 就绪态、运行态、阻塞态; 运行态:进程在cpu中执行的状态; 就绪态:是进程获取了除了cpu之外的其他的资源,只等cpu的调度执行了; 阻塞态:指进程执行时因为需要等待外部的IO输入或者是其他的中断处理,而造成的不能继续在cpu中执行,而被移除cpu之后,等待外部操作完成之后,再次进入就绪状态; 1.3 线程概念 线程是微型的进程; 线程包含在进程中,一个进程中有多个线程,线程之间是可以共享资源的; 线程和进程的调用状态和调度算法是一样; 线程的三态图和五态图和进程是一样; ``` 2. 多线程编程 ``` 2.1 多线程编程实现 继承Thread类; 实现Runnable接口; 通过继承Thread类重写run方法或者是通过实现Runnable接口实现run方法都可以进行多线程编程; 多线程的业务逻辑都是在run方法中实现的; 多线程的启动都是通过start方法启动一个多线程,而不能直接调用run方法(直接调用run方法其实就是一个普通方法调用,不会走多线程的运行机制) 2.2 守护线程和非守护线程 守护线程:为其他线程的运行提供服务的线程,属于系统级别的线程; 非守护线程:也叫作用户线程,用户完成用户的业务逻辑处理的; 当程序运行到只剩下守护线程时,程序就可以进行终止了; 2.3 线程类中常用的方法 run方法:线程的业务逻辑处理方法,必须通过start方法启动,才是多线程,直接调用run方法不是多线程; start方法:线程启动方法;只有通过start方法启动,才是多线程,直接调用run方法不是多线程; sleep静态方法:线程休眠终端方法; join方法:线程之间的调用方法,一个线程可以通过join方法调用两外一个线程,进行调用的主线程会被阻塞,等待被join子线程执行完成之后,才会继续执行; yield方法:调用yield方法,当前线程主动放弃cpu资源,让与其他的线程执行;(主要作用就是让当前线程主动放弃cpu资源,让与其他线程执行) 2.3 线程的终止 因为stop方法过时了,线程终止,需要采用编程的方式进行终止; interrupt方法也不建议使用,因为他是直接终端线程的执行,可能会造成异常发生;不推荐使用; 结束的方式就是从外部闯入一个终止表示变量,结束run即可终止线程的运行; 2.4 线程死锁和线程同步 死锁:以进程说明死锁概念 因为进程(或者线程)在执行时需要使用系统资源;多个进程之间由于占有彼此运行所必须的资源,而相互之间又等待对方先释放资源,而产生了进程之间相互等待的状态,叫做死锁状态; 若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程; 产生死锁的条件: 互斥条件; 请求与保持条件; 不可剥夺; 循环等待; 同步: 同步又叫做互斥访问; 多个进程在申请资源时,是互斥访问的; 同步一般使用同步锁来进行实现,是解决死锁的一中方式; 同步实现是使用同步锁将可能引发死锁的这些个资源作为一个整体进行通过管理,主要是使用互斥访问的方式进行同步管理; 如果一个进程首先申请到了同步锁中的一种资源,那么其他进程就不可以再申请和占有同步锁所管理的其他资源,只能等待当前进程全部释放这些资源之后才能重新申请; java中使用synchronized关键字实现同步锁;注意,synchronized关键字只能给对象类型加同步锁,不能给基本类型加同步锁; 使用同步锁是有系统开销的; 扩展: volatile关键字; 多线程同步: 教材P241-242页面代码; ``` 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)