一. Debug调试
在代码的左边单机,会出现一个红点,当我们用Debug方式来调试程序时,执行到此处便会停止执行,再IDEA的下方会有各种操作,以下介绍各种各样的操作。
f8: 逐行执行程序
f7:进入方法体
shift+f8:跳出方法
f9:调到下一个断点。
总体来说Debug还是比较简单的,它是一种检验代码的工具,在这里简介,以后遇到新的操作会继续补充。
二. 异常
异常类有一个像Collection类的祖宗类,叫做Throwable类,它的下面又包含Error类和Exception类,Error类是错误类,一般程序无法处理,是代码出现了问题。Exception类是异常类,它的下面又有RuntimeException类,这个子类是运行时异常,通常我们不用处理,只需要交给JVM处理即可,他的父类Exception是编译异常,我们必须处理。如果不处理,编译则无法通过。要不throw抛出,要么try-catch捕捉处理。下面依次介绍这两种处理异常的方法。
1. throw和throws
throw用在方法内内部,作为动词抛出。
throws用在方法声明时,作为形容词修饰。
他们的关系是需要同时出现,throws可以作为父类抛出,一般情况下好抛出什么类的异常,就定义什么类的异常。
而且当抛出的是编译异常时,调用这个抛出异常的方法的方法也要处理异常。
public class Throwmain {
public static void main(String[] args) throws Exception {
div(10,0);
}
public static void div(int a,int b) throws Exception{
int sum;
if (b==0) throw new ArithmeticException();//如果分母是零,会抛出异常
else System.out.println(a/b);
}
}
2. try-catch(finally)处理异常
方法在内部就进行了处理异常,不用在向上抛出异常了,而且通过finally语句可以执行异常后的语句,通常用于资源释放。
三. 多线程
1. 并发与并行
并发:指两个或多个事件在同一个时间段内发生。
并行:指两个或多个事件在同一时刻内发生。
通过图片我们可以知道,并发的速度会比并行速度快很多,这难道就是CPU多的优势?
2. 线程和进程
进程:任务管理器中的各种应用程序,在内存中运行。
线程:一个进程中的执行单元,在一个应用程序中会有多个线程,java中便是jvm与CPU建立联系,这种联系便是线程。
3. 创建多线程
-
通过创建一个类进程Thread类,然后重写run,start开始线程。
- 创建一个实现Runnable接口的实现类,然后重写他的run方法,在把这个实现类通过Thread的构造方法创建一个Thread实例,再通过这个Thread实例对象。start开启线程。
这样创建线程,实现了创建和开启线程的分离,降低了耦合性,也就是说我们可以把不同的runnable接口实例化的对象添加到thread中。
4.Thread中的方法
静态方法 getName()获得 当前线程的名字:0,1,2..
静态方法 curruntThread(x)获得名字为x的线程
5.线程中的安全问题
电影院卖票问题,多个线程共享相同的数据时(private tickect),会出现不合法的数据和相同的数据,这时我们可以通过同步代码块,同步方法,和lock锁的方法保证安全。
这些方法其实都有一个共性,就是有一个锁,如果哪个线程“占线”,就把这个锁锁住,其他线程就只能处于停滞状态。这里介绍lock锁。
在实现了runnable类的实现类中,他的成员变量处,用Lock多态实例化一个类,ReentranLock类,这个Lock类和ReentranLock类是父子关系。这玩意就是一个锁。然后我们进入可能会发生安全问题的代码块之前用lock()方法上锁,结束后用unlock()解锁,即可。