- 异常
指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。异常的根类是java.lang.Throwable,其下有两个子类:java.lang.Error与java.lang.Exception,平常所说的异常指java.lang.Exception。
Throwable体系:
-
Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
-
Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好比感冒、阑尾炎。
Throwable中的常用方法:
-
public void printStackTrace():打印异常的详细信息。
包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
-
public String getMessage():获取发生异常的原因。
提示给用户的时候,就提示错误原因。
-
public String toString():获取异常的类型和异常描述信息(不用)。
-
编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
-
运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)
处理:
①throw:throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
②try-catch:try-catch的方式就是捕获异常。
-
捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
注意:try和catch都不能单独使用,必须连用。
③throws:
④finally:
注意:finally默认执行
自定义异常:异常类如何定义:
-
自定义一个编译期异常: 自定义类 并继承于java.lang.Exception。
-
自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException。
定义一个异常处理类:
import java.util.ArrayList;
import java.util.Scanner;
public class ExceptionDemo {
private static ArrayList names;
static {
names = new ArrayList<>();
names.add("张三");
names.add("李四");
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入注册姓名:");
String name = scanner.nextLine();
try {
registerService(name);
System.out.println("注册成功");
} catch (RegisterException e) {
System.out.println("注册失败" + e.getMessage());
}
}
public static void registerService(String name) throws RegisterException {
if (names.contains(name)) {
throw new RegisterException("对不起,名称已被注册");
}
else {
names.add(name);
}
}
}
定义一个业务逻辑异常类:
public class RegisterException extends RuntimeException{
public RegisterException(String message) {
super(message);
}
}
- 线程
-
并发:指两个或多个事件在同一个时间段内发生。
-
并行:指两个或多个事件在同一时刻发生(同时发生)。
-
区别:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。
-
进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
-
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程
-
区别:简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。
1.继承方式实现多线程
2.匿名内部类实现线程
3.实现Runnable接口的方式实现线程
4.匿名内部类实现接口创建线程
package case1;
public class Thread_1 {
public static void main(String[] args) {
//匿名内部类方式
new Thread() {
public void run() {
System.out.println("匿名内部类实现线程");
}
}.start();
// t1.start();
//继承方式
Thread t2 = new Test_Thread();
t2.start();
//创建接口实现类的实例保存在接口的引用中
Runnable r = new Threadimpl();
Thread t3 = new Thread(r);
t3.start();
//匿名内部类实现接口创建线程
Thread t4 = new Thread(new Threadimpl()){
public void run() {
System.out.println("匿名内部类实现接口创建线程");
}
};
t4.start();
}
}
package case1;
public class Test_Thread extends Thread {
public void run() {
System.out.println("继承方式实现多线程");
}
}
package case1;
public class Threadimpl implements Runnable {
@Override
public void run() {
System.out.println("实现Runnable接口的方式实现线程");
}
}
常用方法:
setName:设置线程名
sheep:可以通过改变休眠时间改变线程顺序
yield:线程礼让
package case2;
public class ThreadMethod4 {
public static void main(String[] args) {
new Thread("线程一") {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName() + ",i=" + i);
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.yield();
}
}
}.start();
new Thread("线程二") {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName() + ",i=" + i);
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.yield();
}
}
}.start();
}
}
interrupt:中断线程
join:线程加入
package case2;
public class ThreadMethod5 {
public static void main(String[] args) {
Thread t1 = new Thread("线程一") {
@Override
public void run() {
System.out.println(getName()+"执行");
}
};
t1.start();
Thread t2 = new Thread("线程二") {
@Override
public void run() {
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName()+"执行");
}
};
t2.start();
Thread t3 = new Thread("线程三") {
@Override
public void run() {
try {
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName()+"执行");
}
};
t3.start();
}
}



