- 多线程的实现
- Thread类中常用的方法
- 分析怎样出现线程安全问题
- 处理线程安全的三种方式
- 卖票的案例
- 定时器任务
-
-
-
-
- run()里面的代码还没有执行完,但是没有时间片了,进入了阻塞状态(sleep())
- run()里面的代码执行完,线程进入死亡
-
-
- 新建 new
- 就绪 runnable
- 运行 running,执行run()方法
-
5.线程的生命周期
- 线程的状态认识
-
创建一个同步锁 privite final static ReentrantLock Look = new ReentrantLock(); privite final static ReentrantLock Look = new ReentrantLock(true/fales); 使用方式: public void rum(){ //上锁 Look.lock(); try{ // 执行的代码 }finally{ //解锁 Look.unLook } }
4.锁的概念
- 悲观锁:同步代码块 同步方法(容易造成死锁)
- 乐观锁:同步锁
-
public static synchronized void getWoter(){ } 同步方法的锁是自动加的,如果同步方法是类方法,那么锁就是当前类的字节码对象 如果同步方法的锁是自动加的,如果同步方法是实例方法,那么锁就是当前对象的字节码对象(this.getClass())
3、同步锁:ReentrantLock
- ReentrantLock():没有公平机制
- ReentrantLock(boolean fair):设置公平机制
- Lock():上锁
- unLook:解锁
-
2、同步方法
- 同步方法 synchronized 来修饰方法
-
synchronized(锁:一个对象(所有线程对象共享)){ 会发生线程安全代码 } 线程进入这个代码块就会自动上锁,其他线程就无法进入 等待在里面的线程执行完后,会自动释放锁
-
-
3.【三种】线程安全的处理方式
1、同步代码块
- 同步代码块,将会发生线程安全问题的代码,使用同步代码块锁起来
- 这里创建了一个static的公共锁🔒
- 如果是使用的继承Thread实现多线程,同步代码块中可以使用当前类的字节码对象this.getClass()
- 也可以使用类名.class
-
2.线程安全的发生
- 线程是靠cpu分配时间片,执行的过程时间片用完后,又抢不到时间片
-
4、线程安全
1.线程安全是什么
- 当一个线程正在执行代码(假设有三个步骤1,2,3),还没有全部执行完毕,就由其他线程在执行了,就是线程安全问题
- start():开启线程
- sleep(long millis):让线程进入休眠(阻塞),传入的是毫秒数
- currentThreadd():获取当前正在执行的线程(当前线程)
-
- 什么是守护线程?(后台线程):GC
- isDaemon():判断线程是否为守护线程
- setDaemon(boolean):设置一个线程为守护线程
- getPriority( ):获取线程的优先级(默认为 5 )
- setPriority(int a):设置线程的优先级
-
3. 常用方法:
- getName():获取线程的名字
- setName(String name):设置线程的名字
-
2. 构造方法:
- Thread():创建一个系统分配线程名字的线程。Thread-0
- Thread(String name):创建一个指定线程名称的线程
- Thread(Runnable target):使用制定run方法的对象来创建线进程,线程名字是默认的
- Thread(Runnable target,String name):指定run方法,指定线程名
-
1. Thread:的常量(名字全部大写的是常量)
- MAX_PRIORITY:最大优先级 10
- MIN_PRIORITY:最小优先级 1
- NORM_PRIORITY:默认优先级 5
- 优先级越高,分配时间片的几率越大
-
3、Thread类(多线程类)
- static修饰的是类方法调用方法是 类名.xxx
- 实例方法是没有static修饰的,调用方法是,new一个对象,对象名.xx
-
2、实现线程的两种方式
- 1、继承Thread:线程启动后(放入内存)获取时间片后要执行的代码,是放在run()方法里面的,重写run()方法(继承方式有限制,只能单继承)
- 2、实现Runnable接口:要重写方法
-
- 提高运行效率
- 可以使用多核优势;
- 线程的执行:由cpu为线程分匹配时间片,拿到时间片就执行,时间片用完后就停止,交替执行
- 注:线程的执行不能人为的控制
- 程序设计多线程的意义:
-
3. finally相关的面试题
try{ }catch(){ }finally{ } 只有在执行finally之前结束了java虚拟机的情况才不会执行finally的代码否则都会执行
二、多线程
1、线程的概念
- 线程是一小段可执行的代码,进程启动后线程就放入内存线程也是进程最小的单位
-
- 一般finally是用来关闭程序释放锁
-
int[] arr = {1, 2}; System.out.println(arr[2]); // 下标越界 ArrayIndexOutOfBoundsException String s = null; // null在内存没有引用 System.out.println(s.length()); // 空指针 NullPointerException System.out.println(10 / 0); // 除数为零 ArithmeticException Object obj = new Object(); String s = (String)obj; // 类型转换异常 ClassCastException Integer in1 = new Integer("10a"); // 数字格式异常 NumberFormatException SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.parse("2023-10-10 10:10:10");
2. 异常的处理
- 抛出异常:throws throw
- 捕获处理:try{}catch(){}finally{}
-
-
-
- 数组下标越界
- 空指针异常
- 非法参数异常
- 类型转换异常
- 算数异常
-
-
-
-
- 编译时异常
- 运行时异常
-
-
- Error:错误
- Exception:异常
-
3.异常
1. 体系结构:
- Thrwable
-
2、BigDecimal
- 金融相关的,小数位数的精度不受限制,必须是纯数字
-
一、回顾
1、Biginteger
- 精度超过long时就需要用Biginteger且必须是纯数字
-