冲鸭!!!
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、认识线程
多线程 : 了解,理解,基础的使用
三高网站 : 高可用 高性能 高并发
线程 : 程序执行中的执行顺序流
多线程 : 多任务执行,多路径执行,多个顺序流同时执行就是多线程
多线程特点 :
性能高,效率高,容易出错,需要特别注意,可以出现数据不安全问题
注意: 很多多线程都是模拟出来的,其实同一时刻的喝水与讲课无法同时进行,但是因为切换的非常快,造成了同时执行的错觉
一个cpu统一时刻只能调度一个线程,但是可能快速切换
线程 与 进程 :
进程 : 系统中的程序,一个进程中包含1~n个线程
每个进程都用于独立的代码与数据空间
进程切换开销较大
进程是资源分配的最小单位
线程 : 轻量级的进程
多个线程共享进程的资源,每个线程都用于独立的运行站与程序计数器,线程之间互不影响
线程之间切换开销小,线程的切换不由程序猿控制,只有cpu说了算
线程是cpu调度的最小单位
进程与线程都存在5种状态 : 新生 就绪 运行 阻塞 终止
二、学习线程的内容
1.创建开启线程的方式
方式一
1.继承Thread类,重写run方法 + start开启线程
2.实现Runnable接口,重写run方法 + start开启 - > 推荐
优点 : 接口可以多实现
可以实现资源共享
3.实现juc包下Callable接口,重写call方法 + 线程池开启线程 --> 了解
方式二
实现Runnable接口,重写 run方法,方法内部定义线程体 + start()
优点 :
接口可以多实现,类只能单继承,更加灵活
实现在原资源共享
方式三
实现juc包下的Callable接口,重写call方法 + 线程池
优点:
call方法可以抛出异常,可以定义返回值,run方法不可以
2.线程状态
线程状态 : 五种
新生状态 : new Thread()
就绪状态 : 进入就绪状态,线程可以被cpu调度
1)start()
2)阻塞解除
3)yield 礼让线程
4)cpu调度切换
运行状态 : 当cpu调度某一个处于就绪状态的线程,这个线程会进入到运行状态
阻塞状态 :
1)sleep() 线程睡眠指定ms数
2)wait() 等待
3)join() 加入,合并线程
4)IO
死亡状态 :
1)正常执行完毕
2)通过Thread提供的方法stop()方法等--> 不推荐,已过时
3)通过添加标识判断的方式-->推荐
注意 :
1.一个线程一旦进入终止状态,不能恢复
2.一个线程从 阻塞状态解除,会直接进入到就绪状态,无法恢复运行状态
sleep : 线程休眠|睡眠
sleep(ms) 指定线程休眠多少ms
抱着资源睡觉--> 抱着锁资源睡觉,但是同时会让出cpu的资源
作用 :
1.模拟网络延迟
2.方法问题的可能性
3.线程安全问题 ****
4.线程通信
二、线程应用
yield 礼让线程
让出cpu的资源,同时线程恢复到就绪状态,等待cpu下一次调度
join() 插队,合并线程
调用join方法的线程会进入阻塞状态,等待插队线程执行完毕,执行规定时间后恢复到就绪状态
void join() 等待这个线程死亡。
void join(long millis) 此线程最多等待 millis毫秒。
void join(long millis, int nanos) 此线程最多等待 millis毫秒加上 nanos纳秒。
注意 :
使用join合并线程时候,需要先就绪,在调用join合并线程
getState() 获取线程状态
Thread.State线程状态。 线程可以处于以下状态之一:
NEW --> 新生
尚未启动的线程处于此状态。
RUNNABLE ->就绪运行
在Java虚拟机中执行的线程处于此状态。
BLOCKED ->线程在等待对象锁的阻塞状态
被阻塞等待监视器锁定的线程处于此状态。
WAITING -> join,wait等待状态
无限期等待另一个线程执行特定操作的线程处于此状态。
TIMED_WAITING --> 与时间相关的等待 join(ms) sleep(ms)...
正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。
TERMINATED -> 终止状态
已退出的线程处于此状态。
线程优先级 :
1~10 --> 1最小 10最大 默认为5
static int MAX_PRIORITY 线程可以拥有的最大优先级。
static int MIN_PRIORITY 线程可以拥有的最低优先级。
static int NORM_PRIORITY 分配给线程的默认优先级。
void setPriority(int newPriority) 更改此线程的优先级。
int getPriority() 返回此线程的优先级。
优先级的大小决定优先执行的可能性,不是绝对的
守护线程 了解->选择|判断
void setDaemon(boolean on) 将此线程标记为 daemon线程或用户线程。
线程 :
用户线程 : 默认
守护线程 : 守护线程用来守护用户线程的
当所有的用户线程全部执行完毕,守护线程无论是否执行完毕都会直接结束
注意:
垃圾回收机制是典型的守护线程
线程安全 ***
多线程同时操作同一份资源,才有可能出现数据不安全问题
同步锁: (多个线程排队执行一段代码) synchronized
部分 :
1)同步条件 : 控制多个线程排队执行的条件
对象的锁资源,每个对象只有一个
2)同步代码块 : 多个线程排队执行的代码段
使用 :
同步方法 : 方法上synchronized修饰
成员方法
静态方法
同步条件 :
成员方法 : 调用方法的对象
静态方法 : 类的Class对象
同步代码块 : 整个方法体
整个方法体多个线程之间排队执行
同步块 :
synchronized(条件){
排队执行的代码段;
线程通信
实现生产者消费者模式
wait()与notify(),notifyAll()实现线程通信
要求使用在同步环境下,用于协调多线程对共享数据的存储问题
wait()与notify(),notifyAll()方法凯子与Object类中的方法
wait : 当一个线程执行到 对象.wait()方法时候,当前线程会进入到一个与该对象相关的等待池中进行等待(等待队列,是阻塞的一种,等待阻塞)
同时释放对象锁,并让出cpu的资源,等待执行时间结束|等待被唤醒
sleep : 线程休眠
让出cpu的资源,但是不会释放对象的锁--> 抱着资源睡觉
notify : 当一个线程执行到 对象.notify()的时候,会唤醒当前对象等待池中正在等待的线程,处于就绪状态,想要继续执行需要获取对象的锁并被cpu调度才能执行
总结
线程将持续更新