复习
异常
概念:因语法,思路,硬件等问题导致程序非正常结束的都称为异常
分类:
Throwable 错误:Error 异常:Exception 检查时异常: CheckedException 运行时异常: RuntimeException异常出现后导致的情况
程序无法正常结束解决方案
方案1:try catch 真的是在解决问题 语法: try{ 异常代码 }catch(异常类型 变量名){ 处理方式 }catch(异常类型 变量名){ 处理方式 } ... catch(异常类型 变量名){ 处理方式 }finally{ 比逊执行的代码, } 注意: 1,catch先子后父,如果没有继承关系无所谓顺序 2,finally可有可无,最多只能有一个 3,try中代码不易过多 方案2:throw与throws throw: 作用:抛出异常,把异常扔出去 语法: throw 异常对象; 位置: 方法中 throws 作用:声明异常,就是告诉你有问题 语法: throws 异常类型1,异常类型2,... 位置: 形参之后自定义异常
步骤: 1,创建一个类 2,使其继承与Exception或Exception的子类 3,编写其构造函数 父类无参 父类有参 str:异常信息
数据结构
栈
队列
单链表
Alt + 回车,选择对应的可快捷写异常
今日
线程的初识
作用
使代码可以同时执行多个事物
名词
进程: 一个正在进行的程序 线程: 一个执行路径 多线程: 一个进程中有多个线程 主线程: 一个进程在创建时自带的一条线程,该线程被称为主线程 子线程: 除主线程以外的线程都是子线程 守护线程(后台线程): 特点:如果一个进程的前台线程全都被销毁,此时不管是否有守护线程正在执行,此时进程都将被回收 前台线程 特点:如果一个进程中有前台线程存活,此时系统将不会回收进程
线程的组成
CPU时间片
线程抢夺到CPU执行权后可执行的时间内存
一个线程一个栈内存,多个线程共享一个堆内存逻辑
使用步骤
1,创建 2,使用
线程的创建
方案1:创建Thread的子类对象
方式1:创建Thread的子类对象 步骤: 1,创建一个类 2,使其继承与Thread 3,重写run方法 注意:当前线程启动后,将执行run方法中的代码 4,创建该类对象 优点: 可以创建无数个该类对象 方式2:使用匿名内部类的形式创建Thread的子类对象 步骤: Thread 对象名 = new Thread(){ 重写run方法 }; 优点: 便于书写 缺点: 只能创建一个该线程对象方案2:将线程(Thread)与线程任务(Runnable)分开
方式1:普通方式创建Runnable的子类对象 步骤: 1,创建一个类 2,使其实现Runnable接口 3,重写run方法 4,创建该类对象 5,在创建线程对象时传入该类对象(线程任务对象) 方式2:使用匿名内部类创建Runnable的子类对象 步骤: 1,Runnable 对象名 = new Runnable(){ 重写run方法 }; 2,创建线程对象时传入该类对象(线程任务对象)
线程的启动
线程对象.start(); 注意: 1,当线程启动后会开启新的执行路径,执行run方法中的代码 2,如果直接使用线程对象调用run方法,不会开启新的执行路径
线程的销毁
线程已经启动,无法控制,需要等待执行完run方法中的代码
获取当前线程对象
Thread.currentThread();
线程名称
获取线程名称 线程对象.getName(); 修改线程名称 线程对象.setName(name); 注意:在启动之前
线程的优先级
作用:提高线程抢夺到CPU执行权的概率(不管设置多大都不可控)
语法: 线程对象.setPriority(int); 设置线程优先级 注意: 1,取值范围1~10 2,必须在线程启动前
线程休眠
作用:让线程暂时停止运行
方法: static void sleep(休眠时间); 使用: Thread.sleep(); 写在哪里,就是让哪个线程休眠 注意: 1,单位毫秒 2,使用类名调用,使当前线程休眠 3,线程休眠期间不会抢夺CPU执行权
线程的礼让
作用:将获取到的CPU执行权让出,重新参与抢夺
方法: static native void yield(); 使用: Thread.yield(); 写在线程中
线程合并
作用:合并线程
方法: public final void join()案例
package com.qf.demo011; public class Test { public static void main(String[] args) { //线程一 Thread t01 = new Thread(new Runnable() { @Override //重写run方法 public void run() { for (int i = 0; i < 100; i++) { try { Thread.sleep(1);//从这里开始睡眠1毫秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程1:" + i); } } }); //线程二 Thread t02 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100; i++) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程2:" + i); if (i == 50){ try { //将线程1合并到线程2中 //此时先执行完线程1未完成的代码,在执行线程2未完成的代码 t01.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); t01.start(); t02.start(); } }
守护线程
简介
又名:后台线程 特点: 当一个进程中有前台线程存活,此时该进程就不会被系统回收 如果一个进程中只剩后台线程,此时不管后台线程中的代码是否运行完毕,系统都将回收该进程 方法: public final void setDaemon(boolean on); true表示守护线程,默认为false,表示前台线程 注意: 1,创建的线程对象与主线程默认为前台线程 2,必须在线程启动前
线程的生命周期
创建 就绪 运行 消亡 休眠 有限期 无限期
作业
1,整理笔记 2,使用四种方法创建线程对象,并启动 3,请问使用线程对象调用start方法与调用run方法的区别 4,如何获取当前线程 5,编写线程打印大写字母A~Z 6,编写线程打印小写字母a~Z 7,编写程序打印数字1~52 8,编写代码实现5个线程各自销售1000张票的问题 9,编写代码实现5个线程共销售1000张票的问题 10,一个线程打印大写字母,一个线程打印小写字母,打印结果要求如下 AaBbCcDd...Zz 11,一个线程打印大写字母,一个线程打印数字1~52,打印结果要求如下 12A34B56C78D...5152Z 12,使用代码讲述龟兔赛跑的故事