java进阶打卡15

本文探讨了在Java中如何自定义异常类及其实际应用,如在模拟注册功能时处理用户名已存在的异常情况。同时,文章还深入讲解了并发与并行的概念,区分了并发中的交替执行和并行的同一时刻执行。此外,介绍了进程与线程的关系以及Java中的线程调度策略,包括分时调度和抢占式调度,并指出Java采用的是抢占式调度方式。
摘要由CSDN通过智能技术生成

自定义异常类

java提供的异常类,不够我们使用,需要自己定义一些异常类

格式:
    public class XXXException extends Exception / RuntimeException{
        添加一个空参数的构造方法
        添加一个带异常信息的构造方法
    }
注意:
    1. 自定义异常类一般都是以Exception结尾,说明该类是一个异常类
    2. 自定义异常类,必须得继承Exception或者RuntimeException
        继承Exception:那么自定义得异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须处理这个异常,要么throws,要么try...catch
        继承RuntimeException:那么自定义得异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)

public class RegisterException extends Exception /*RuntimeException*/ {
    public RegisterException(){
        super();
    }
    
     // 查看源码发现,所有得异常类都会有一个带异常信息的构造方法,方法内部会调用父类带异常信息得构造方法,让父类来处理这个异常信息
    public RegisterException(String message) {
        super(message);
    }
}

自定义异常类练习

要求:我们模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。

  • 分析
1. 使用数组保存已经注册过得用户名(数据库)
2. 使用Scanner获取用户输入的注册用户名(前端,页面)
3. 定义一个方法,对用户输入的注册用户名进行判断
	遍历存储已经注册过的用户名的数组,获取每一个用户名
	使用获取到的用户名和用户输入的用户名比较
		true:
	        用户名已经存在,抛出RegisterException异常,告知用户"亲,该用户名已经被注册";
        false:
            继续遍历比较
    如果循环结束了,还没有找到重复的用户名,提示用户"恭喜您,注册成功!";
  • main方法
    static String[] usernames = {"张三","李四","王五"};

    public static void main(String[] args) /*throws RegisterException*/ {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您要注册的用户名");
        String username = sc.next();
        
        checkUsername(username);
    }

1. 自定义异常类继承Exception:
    public static void checkUsername(String username) /*throws RegisterException*/ {
        for (String name : usernames) {
            if (name.equals(username)){
                try {
                    throw new RegisterException("亲,该用户名已经被注册");
                } catch (RegisterException e) {
                    e.printStackTrace();
                    return; // 结束方法
                }
            }
        }
        
        System.out.println("恭喜您,注册成功!");
    }

2. 自定义异常类继承RuntimeException:
	public static void checkUsername(String username) {
        for (String name : usernames) {
            if (name.equals(username)){
                throw new RegisterException("亲,该用户名已经被注册"); // 抛出运行期异常,无需处理,交给JVM处理,中断处理
            }
        }

        System.out.println("恭喜您,注册成功!");
    }

并发与并行

  • 并发:指两个或多个事件在同一个时间段内发生。 交替执行 类似一个人吃两个馒头
  • 并行:指两个或多个事件在同一时刻发生(同时发生)。 同时执行 类似两个人吃两个馒头

进程与线程

硬盘:永久存储ROM
内存:所有的应用程序都需要进入到内存中执行 临时内存RAM

点击应用程序执行,进入到内存中,占用一些内存执行,进入到内存的程序叫【进程】。
任务管理器 --> 结束进程 那么就把进程从内存中清除了

cpu:中央处理器 对数据进行计算,指挥电脑中软件和硬件干活
cpu的分类:
	AMD
	Inter	Inter Core(核心) i7 8866 4核心8线程
	8线程:同时执行8个任务

腾讯电脑管家:点击运行,会进入到内存中,就是一个【进程】
病毒查杀		清理垃圾		电脑加速
由代码编写	由代码编写	由代码编写
【线程】		【线程】		【线程】
cpu			cpu			cpu

点击功能(病毒查杀,垃圾清理,电脑加速)执行,就会开启一条应用程序到cpu的执行路径,
cpu就可以通过这个路径执行功能,这个路径有一个名字,叫【线程】

【线程属于进程,是进程中的一个执行单元,负责程序的执行】
  • 多线程
单核心单线程cpu:
cpu在多个线程之间做高速的切换,轮流执行多个线程,效率低,切换速度(1/n毫秒)

4核心8线程:
有8个线程,可以同时执行8个线程,8个线程在多个任务之间做高速的切换,速度是单线程cpu的8倍(每个任务执行到的机率都被提高了8倍)

多线程好处:
	1. 效率高
	2. 多个线程之间互不影响

线程调度

  • 分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间
  • 抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性)。
    Java使用的是抢占式调度。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值