2021_06_14_异常和线程
1. 能够辨别程序中异常和错误的区别
异常 exception 捕获并处理程序还能运行
错误 error 无法捕获无法处理,程序崩溃
2. 说出异常的分类
exception
- runtimeException
- checkedException
3. 异常体系
- Java.lang.Throwable
- Error 无法解决只能尽量避免,一旦出现程序崩溃
- Exception 可以避免和解决,处理完成程序正常运行
- RuntimException
- CheckedException
- Throwable 常用方法
- printStackTrace() 打印异常的详细信息异常种类,异常出现位置
- getMessage() 获取异常的原因
- toString() 获取异常的类型和异常描述信息
4. 列举出常见的三个运行期异常
- IndexOutOfBoundsException
- NullPointerException
- SqlException
- NumberFormatException
5. 能够使用try…catch关键字处理异常
try{
int i = 1/0;
}
catch(ArithmeticException e){
e.printStackTrace();
}
6. 能够使用throws关键字处理异常
-
throw 方法内使用 抛出一个指定的异常
-
throws 使用在方法上,抛出给调用该方法的人,可能出现异常,多个异常用,隔开
7. 能够自定义异常类
- 编译时期异常 extends java.lang.Exception
- 运行时异常 extends java.lang.RuntimeException
public class SelfException{
private Static final String[]names = {"bill","cill","jill"};
main{
try{
checkUsername("jill");
}catch(RegisterException e){
e.printStackTrace();
}
}
private static void checkUsername(String username) throws RegisterException{
for(String name:names){
if(name.equals(username)){
throw new RegisterException(username+"已经存在,请重试>>>");
}
}
return true;
}
}
//自定义异常类
class RegisterException extends Exception{
/**
*空参构造
*/
public RegisterException(){
}
/**
*带参构造
*/
public RegisterException(String message){
super(message);
}
}
8. 能够处理自定义异常类
- try catch 自行处理
- throws 抛给调用者
##9. 并行和并发
-
并发: 多个线程在单个核心运行,在一个时间单元内只有一个线程运行,系统不停切换线程,看起来像是同时运行,实际是线程不停切换,即指令之间交错执行,操作系统称这种交错执行的机制为:上下文切换;
-
并行: 每个线程分配给独立的核心,线程同时运行
-
上下文切换:CPU给线程分配时间片(也就是分配给线程的时间),执行完时间片后切换到另一个线程
-
切换之前会保存线程的状态,下次时间片再给这个线程时才能知道当前状态
-
从保存线程A的状态再切换到线程B时,重新加载线程B的这个状态的过程就是上下文切换
-
上下文切换会消耗大量的CPU时间
-
单核CPU: 微观并发,宏观并行
- 不存在多线程!一个时间单元内只能执行一个线程的任务,因此在单核CPU上各个程序是分时的交替执行,但是因为一个时间单元非常短,所以感觉起来像是同时运行多个任务
-
多核CPU:微观并行
- 每个线程分配给独立的CPU,各不影响
10. 程序 进程 线程
- 程序: 是为了完成某种特定任务,用某种特定语言编写的一组指令的集合 静态对象
- 进程: 资源分配的单位,系统在运行时候会为不同的进程分配不同的内存区域 动态
- 线程: 进程进一步细化成为线程,是程序内部的一条执行路径
- 线程特点
- 资源调度和执行的单位
- 拥有独立的运行栈和程序计数器(PC),线程切换开销小
- 同一个进程中的线程共享相同的内存单元,可以访问相同的变量和对象
- 线程特点
11. 能够开启新线程
- 继承Thread类,重写run方法,调用Thread对象的start方法
- 实现Runnable接口,对象传入Thread构造方法,调用Thread对象的start方法
- 实现Callable接口,Callable接口对象传入FutureTask构造函数,FutureTask对象传入Thread构造函数
- 从线程池中获取
ExecutorService executorService = Executors.newFixedThreadPool(4);