多线程
2023-07-29 15:45:53 2 举报
AI智能生成
多线程
作者其他创作
大纲/内容
进程:运行中的程序就是一个进程(特点:宏观并行,微观串行)
线程:程序中的控制流程,它是CPU的调度单元
关系:一个进程中包含一个或多个线程
进程和线程
1.通过继承Thread类
2.实现Runnable接口
1.创建Thread类,那么当前类就是一个线程类。实现Runnable接口当前这个类只是一个线程任务。
2.在java中只支持单继承,所以实现Runnable更加的灵活
两种方式的区别:
若没有设置,默认名为Thread-N
1.设置线程名(setName、getName(获取线程名))
若没有设置,默认优先级为5,设置优先级只能提高抢占CPU的概率
2.设置线程优先级(setPriority、getPriority)
让当前线程进入休眠状态,并让出CPU使用权,直到休眠结束才会继续抢占CPU
3.线程休眠(Thread.sleep(毫秒数))
本次会立马让出CPU使用权,但是立马会去抢下次的CPU使用权
4.线程礼让(yeild)
在当前线程中加入另一线程,必须要将另一个线程执行完之后才会继续执行当前线程
5.线程加入(join)
线程的常用方法
线程的状态(等待)
创建线程(重点)
多个线程操作临界资源,破坏原子操作,可能会造成数据不一致
线程不安全:
synchronized(临界资源对象){ //互斥锁标记
1.同步代码块
public synchronized void sale(){ //互斥锁标记是this对象
2.同步方法
如何解决线程不安全:
1.同步方法
2.同步代码块
线程同步买票问题
线程安全(重点)
线程的生命周期
当第一个线程拥有A对象的锁标记,并等待B对象的所标记。同时第二个线程拥有B对象锁标记,同时等待A对象的锁标记时,产生死锁
线程死锁
原理
静态线程池(newFixedThreadPool(指定线程数))
动态线程池(newCachedThreadPool())
1.这两个接口都可以当做线程任务提交并执行
2.Callable接口执行完线程任务之后有返回值,而Runnable接口没有返回值
3、Callable接口中的call方法已经抛出了异常,而Runnable接口不能抛出编译异常
区别:
Callable接口和Future接口
核心线程池大小即初始化的线程数
1.corePoolSize
最大线程池大小
2.maximumPoolSize
线程池的最大空闲时间,超过这个时间后,空闲线程会被回收
3.keepAliveTime
keepAliceTime的时间单位
4.unit
任务队列,用于存放等待执行的任务
5.workQueue
线程工厂,用于创建新线程
6.threadFactory
拒绝策略,用于处理无法处理的任务
7.handler
线程池7个核心参数
直接提交任务队列
有界任务队列
无界任务队列
优先任务队列
延迟任务队列
可靠性任务队列
并行任务队列
常见的任务队列
synchronized和Lock锁的区别:1、Lock是Java中的类,synchronized是Java中的关键字2、Lock是显示的上锁和释放锁,而synchronized自动上锁和释放锁3、当同步代码出现异常,Lock不会自动释放锁(可能会出现死锁),synchronized会自动释放锁对象4、Lock锁和synchronized锁都可以实现重入锁(避免死锁)5、Lock锁可以实现公平锁和非公平锁,synchronized不能实现公平锁6、Lock中提供了读写锁(特点:读读不互斥。读写互斥。写写互斥)
读写锁
重入锁
公平锁
当锁对象被创建,还没有线程进入的时候,此时锁对象出于无锁状态
1.无锁
线程A进入同步代码并获得锁对象时会保存线程id,以后线程A进入到同步代码中无需使用CAS加锁或释放锁,只需要验证线程id
2.偏向锁
当前锁处于偏向锁,后面线程B进入到同步代码,线程AB会使用CAS竞争并升级为轻量级锁
3.轻量级锁(自旋锁)
若线程没有获得轻量级锁,且自旋次数大于阈值(10次),则会升级为重量级锁
4.重量级锁
synchronized锁升级
Lock锁
线程池
互斥锁标记:任意java对象,一定要保证唯一
多线程
0 条评论
回复 删除
下一页