- 一、多进程多线程概述
- 1.1、什么是多线程多进程
- 1.2、第一个多线程程序
- 二、多线程详解
- 2.1、继承Thread创建线程
- 2.2、线程的状态
- 2.2.1、线程的初始化
- 2.2.2、线程的运行状态
- 2.2.3、线程的冻结状态
- 2.2.4、线程的死亡状态
- 2.3、通过实现Runnable接口创建线程
- 三级目录
- 三、线程的同步
- 3.1、同步代码块
- 3.2、同步方法
- 3.2.1、同步重构方法
- 3.2.2、同步run方法
- 3.2、线程的休眠
- 3.3、死锁
- 线程间的通讯
- 生产者消费者
- 三级目录
- 守护线程与线程的优先级
- 守护线程
- 线程的yield
- 线程的停止
- 线程的优先级
- 线程join
- 线程的interrupt
- 线程池的实现
- 线程组
- 线程池雏形
- 三级目录
- 线程状态的监控
- 二级目录
- 三级目录
- 总结
- 二级目录
- 三级目录
进程简单的来说就是一个个应用程序,一个应用程序中一般都包含多个线程,线程可以理解为任务,即进程中最小的任务粒度单位。线程开启的两种方式:继承Thread类和实现Runnable接口
1.2、第一个多线程程序 二、多线程详解 2.1、继承Thread创建线程线程thread的start方法表示启动一个线程,start代码中调用了JNI函数start0,其中用到了模板模式
2.2、线程的状态 2.2.1、线程的初始化使用关键字new创建一个新线程,等待被start被称为线程的初始化
2.2.2、线程的运行状态创建完线程后,显式的调用了start方法,此处线程就可能处于运行状态(取决于cpu),start了之后不一定会立马运行,要等待cpu轮询,进行时间片的分配,分配给当前线程,线程才可以运行,之前称之为临时状态。
2.2.3、线程的冻结状态线程被调用了sleep或者wait方法之后,放弃了cpu的执行权,但是可以回到运行状态
2.2.4、线程的死亡状态线程死亡可能由以下几种情况造成:
1)致命异常
2)线程正常执行完毕
线程的死亡是不可逆过程
线程只能被启动一次
Runnable只是一个任务的接口,并不是一个线程,它只是为了将线程与业务执行逻辑分离
锁定义的规则:
加锁,就是为了防止多个线程同时操作一份数据,如果多个线程操作的数据都是各自的,就没有加锁对的必要
共享数据的锁对于访问他们的线程来说必须是同一份,否则锁只能私有的锁,各锁个的,起不到保护共享数据的目的。加入将Object lock的定义放到run方法里面,每次都会实例化一个lock,每个线程获取的锁都是不一样的,也没有争抢可言。
锁的定义可以是任意的一个对象,该对象可以不参与任何运算,只要保证在访问的多个线程看来他是唯一的即可。
方法的同步和代码块的公布大相径庭就是在方法名前面加上synchronized关键字。
3.2.1、同步重构方法同步重构方法与同步代码块实现的功能类似
3.2.2、同步run方法如果只是普通使用,可以加;如果在多线程条件下使用,坚决禁止在run方法上添加synchronized关键字,因为run方法加锁,真实情况是会有多个线程运行,但是只有一个线程执行业务逻辑
同步代码块锁的是一个对象,同步方法锁的是什么呢?this锁和static锁
同步函数用到的锁是this锁
this锁和static锁区别:
https://vipstone.blog.csdn.net/article/details/119337991?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
notify和wait的作用
notify:通知其他线程
Object的wait,notify,notifyAll
wait方法和之前sleep一样就是放弃cpu执行权,但是它和sleep不一样的地方是需要等待另外一个持有相同锁的线程对其进行唤醒操作,并且wait方法必需有一个同步锁,否则会抛出一个异常
notify详解:
notify方法就是将之前处于临时状态的线程唤醒,并且获得执行权,等待cpu的再次调度,但是有一点需要注意的是必需和之前的wait方法用到的锁是同一个。
notifyAll:
唤醒和自己持有相同锁的全部线程
线程名.setDaemon(true):设置某个线程为守护线程
线程的yieldyield方法短暂放弃cpu执行权
线程的停止stop方法存在线程安全问题,被过期掉了
线程结束有两种方式:
1)正常结束
2)死循环退出
设置线程的优先级来使特定线程获取cpu的几率变大
线程join临时加入一个线程,等到该线程执行结束之后才能运行主线程
线程的interrupt将处于阻塞中的线程打断,线程将从阻塞状态转换到临时状态或者其他状态,执行该方法会抛出一个异常,也就是wait方法或者sleep方法中我们需要捕获的异常InterruptedException
线程池的实现 线程组 线程池雏形线程池需要具备的条件:
1)任务队列
2)线程管理者
3)最大活跃线程数
4)线程最小数
5)线程最大数



