2017-9-1 - A - 异常处理 - 多线程基础

Posted 清及

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017-9-1 - A - 异常处理 - 多线程基础相关的知识,希望对你有一定的参考价值。

1 可以自行抛出异常吗?什么时候需要?
可以,例如在处理异常后,将异常抛出,让上一层异常处理块捕捉。

2 如何设置异常?在方法体设置了抛出的异常,声明中也必须抛出吗?如何添加?方法添加了throws后,测试的代码在调用方法时是否必须处理异常?
public void setAge(int age){
/*
* 当传入的参数不满足业务逻辑要求
* 比如年龄不在0-100之间的数字认为不符合要求时,
* 可以当做异常抛出给调用者
*
* when the posted params not setisfy the
*/

if(age < 0||age > 100){
throw new RuntimeException("年龄不合法");
}

this.age = age;
}

必须,除了RuntimeException可以不加。

public void setAge(int age) throws Exception{
if(age < 0||age > 100){
throw new Exception("年龄不合法");
}
this.age = age;
}

public static void main(String[] args) {
Person p = new Person();
try {
p.setAge(100);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(p.getAge());

什么时候需要try...catch...捕获处理异常?
当异常需要你处理的时候。

3 如何理解抛出异常和处理异常的关系?
在方法内部代码有可能出现错误处定义可能出现的异常,方法内部定义了异常便需要在方法定义处声明异常,而调用声明了异常的方法必须处理异常,处理异常的方式有两种,当异常归调用方法的代码块处理时,使用try...catch捕获并处理
当异常不归调用处处理时可继续往外抛。

4 该段代码是否能够执行?
Person p = new Person();
try {
Exception e;
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(p.getAge());
可以,捕获异常并处理,这就是抛出来处理。

4 子类重写父类含有throw声明的方法时的规则是什么?
可不抛出任何异常,可抛出一部分(throws可抛出多种异常,以逗号隔开),可抛出子类异常,
但不可抛出额外异常(父类没有的异常),父类异常的父类异常
即,可抛出异常必须小于或等于父类的异常

5 异常可分为?
检查异常和不检查异常(RuntimeException及其子类)

7 异常的api有哪些?
控制台上输出错误流程——用以跟踪错误:
printStackTrace()
————使用示例
try {
String str = "abc";
System.out.println(Integer.parseInt(str));
} catch (Exception e){
e.printStackTrace();
}

用以输出错误的直接原因(事实上,便相当于设置异常时返回的内部字符串)throw new RuntimeException("年龄不合法");——如上方代码是因为输入了abc,
e.getMessage()
————返回示例
“For input string: "abc"”

8 如何自定义异常?
a,命名异常
b,继承Exception或自定义的异常。
c,生成父类构造。

public class IllegalAgeException extends Exception{

public static void main(String[] args) {

}

public IllegalAgeException() {
super();
// TODO Auto-generated constructor stub
}

public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
...
}

}

9 多线程的工作机制是?
以高性能在多任务间快速切换运行。

10 什么是进程?
操作系统正在运行的任务。进程实际上一块包含某些自愿的内存资源。

11 线程是?
是进程内多个同时运行的服务。因此调用的是同一个进程内的运存。

12 如何在java中新建线程?如何启动线程?如何理解线程?
extends Thread

public class ThreadDemo1 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1 = new MyThread1();
Thread t2 = new MyThread2();
/*
* 启动线程调用start方法。不要直接调用线程的run方法。
* 当start方法执行完毕后,线程纳入线程调度,一旦该线程获取cpu时间片
* (执行时间)开始运作是会自动调用自己的run方法开始工作。
*/
t1.start();
t2.start();
}

}

线程用于解决同时运行多个程序的问题

13 如何解决Thread与单继承的冲突?
使用实现Runnable接口实现多线程。

public class ThreadDemo2 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable r1 = new MyRunnable();
Runnable r2 = new MyRunnable2();

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1.start();
t2.start();
}

}

class MyRunnable implements Runnable{
public void run(){
for(int i = 0;i < 100;i++){
System.out.println("瞅啥瞅");
}
}
}

class MyRunnable2 implements Runnable{
public void run(){
for(int i = 0;i < 100;i++){
System.out.println("瞅你咋了");
}
}
}


14 请分别以两种方式建立线程实例的匿名内部类.
public class ThreadDemo3 {

public static void main(String[] args) {
Thread t1 = new Thread(){
public void run(){
for(int i = 0;i < 100;i++){
System.out.println("瞅啥瞅");
}
}
};

Runnable r2 = new Runnable(){
public void run(){
for(int i =0;i < 100;i++){
System.out.println("瞅你咋了");
}
}
};
Thread t2 = new Thread(r2);

t1.start();
t2.start();

}

}

15 如何获取当前运行方法调用的线程?
Thread t = Thread.currentThread();

16 java中所有方法都是靠线程运行的,方法内的子方法调用的是同一个线程,除非在方法内新建线程,在新建线程内调用其他方法,
这时其他方法的线程便是新建的线程

16 如何中断当前进程?
T.interrupt();

17 如何获取当前线程的信息?
线程的名字,线程ID,优先级,线程活动状态,是否为守护线程,是否被中断
Thread T = Thread.currentThread();
String name = T.getName();
long id = T.getId();
int priority = T.getPriority();
boolean isAlive = T.isAlive();
boolean isDaemon = T.isDaemon();
boolean isInterrupt = T.isInterrupted();

18 如何设置线程优先级?
/**
* 线程的优先级
*
* 线程优先级有10个等级,分别用整数1-10表示
* 1最低,10最高,5位默认优先等级
*
* 由于线程不能干涉线程调度工作,即:不能主动获取CPU时间,也不能决定时间片长短。
* 所以只能通过调整优先级最大程度改善获取CPU时间片的几率
* 理论上线程优先级越高,获得时间片的次数越多。
* @author admin
*
*/

19 什么是守护线程?如何定义守护线程?
即后台线程
public static void main(String[] args) {
Thread rose = new Thread(){
public void run(){
for(int i=0;i<5;i++){
System.out.println("rose:let me go!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("rose:啊啊啊啊啊AAAAAAAaaaaa.....");
System.out.println("效果:噗通");
}
};

Thread jack = new Thread(){
public void run(){
while(true){
System.out.println("jack:you jump! i jump!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
//设置后台线程要在start之前设置
jack.setDaemon(true);

rose.start();
jack.start();

}

20 long,float型数据定义后默认值为?
0L(L不显示)
0.0f(f不显示)

21 int a = 10;a = a++ + 10;a++;syso(a)?
结果为21,第二步虽然自增了,但最后重新赋给了a.

22 如何按照"时:分:秒"格式输出时间?
获取当前时间的毫秒数,传入设定好格式的sdf中的format转换函数,输出的便是该格式的字符串.
Date date = new Date();
long time = date.getTime();
SimpleDateFormat trans = new SimpleDateFormat("HH:mm:ss");
System.out.println(trans.format(time));

23 如何延迟时间?
使用Thread.sleep().
————
21

待办清单
①复习第二阶段所有内容
②完成每日练习
③复习第一阶段内容

以上是关于2017-9-1 - A - 异常处理 - 多线程基础的主要内容,如果未能解决你的问题,请参考以下文章

C#多线程开发-处理异步操作中的异常

.net捕获全局异常并且记录日志多线程方式发送邮件提醒

多线程多线程中的异常处理

java 多线程 25 :线程和线程组的异常处理

3Java多线程-处理子线程异常

C#多线程开发-处理子线程中的异常