1. 本章学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容。
① 定义Thread类的子类,覆盖Thread类的run()方法,然后创建该子类的实例(一般不用该方法,开销大。 ② 定义实现Runnable接口的类,实现它的run()方法,然后将这个类的实例作为Thread的构造方法的参数,创建Thread类的实例(常用) Runnable不是线程,只有Thread是线程。必须将实现Runnable的类的对象放入Thread中,才能在线程中运行。 ③ Runnable不是线程,只有Thread是线程。必须将实现Runnable的类的对象放入Thread中,才能在线程中运行。将Runnable看作一项任务,而非线程。
2. 书面作业
本次作业题集异常
、多线程
- Q1:finally 题目4-2
1.1 截图你的提交结果(出现学号)
1.2 4-2中finally中捕获异常需要注意什么?
答:不论try语块中是否出现异常,finally一定会被执行。一般在finally语块中进行使用资源的关闭。
- Q2:用异常改进ArrayIntegerStack 题目4-3
2.1 截图你的提交结果(出现学号)
2.2 实验总结
答:
如果栈满,抛出ArrayIntegerStack
之前就写过,只需按照题目要求进行异常判断即可。FullStackException
异常;如果栈空,抛出EmptyStackException
异常。- Q3:自定义异常 题目5-4
3.1 截图你的提交结果(出现学号)
3.2 自定义异常有哪几个关键点?
答:以本题为例。定义
IllegalNameException
是Uncheck Exception需继承RuntimeException
;定义IllegalScoreException
是Checked Exception需继承Exception
。Q4:读取文件并组装对象
中的题目3:读取文件并组装对象 给出关键代码(需出现你的学号)public class ReadFileUsingScanner201521123064 { ...... while (in.hasNextLine()) { ...... try { String a1 = lineScanner.next();// 姓名 if (a1.length() != 2 && a1.length() != 3 && a1.length() != 4) { System.err.println(line); throw new IllegalAccessException("姓名出错!"); } String a2 = lineScanner.next();// 身份证号 if (a2.length() != 18) { System.err.println(line); throw new IllegalAccessException("身份号出错!"); } String a3 = lineScanner.next();// 性别 if (!a3.equals("男") && !a3.equals("女")) { System.err.println(line); throw new IllegalAccessException("性别出错!"); } String a4 = lineScanner.next();// 年龄 String a5 = lineScanner.next();// 地址 while (lineScanner.hasNext()) {// 谨防地址只有一段 a5 += lineScanner.next(); } System.out.println(a1 + " " + a2 + " " + a3 + " " + a4 + " " + a5); } catch (IllegalAccessException e) { System.out.println(e); } } }
运行结果:
- Q5:学会使用Eclipse进行调试 观看相关调试视频
5.1 简述使用Eclipse进行调试需要几步?
答:①设置断点 → ②开启debug模式 → ③运行程序 → ④解决所遇问题
5.2 调试时F5, F6, F7快键键各有什么不同?什么情况该使用哪个快捷键?
答:F5(Step Into):跳入该方法中,比如查看具体是哪一行代码出错;
F6(Step Over):跳过该方法; F7(Step Return):跳回上一级。5.3 除了Eclipse的调试器,你还使用什么方法调试程序?
答:我一般用
System.out.println();
来输出具体信息。- Q6:题集
多线程
6.1 程序填空3-1、3-2。(截图提交结果,出现你的学号)
6.2 函数4-1(Thread)、4-2(Runnable)(截图提交结果,出现你的学号)
- 6.3 函数4-3(Runnable与匿名内部类)(截图提交结果,出现你的学号),并使用Labmda表达式改写。
-
Labmda表达式改写:
public static void main(String[] args) { final String mainThreadName = Thread.currentThread().getName(); Thread t1 = new Thread(() -> { System.out.println(mainThreadName); System.out.println(Thread.currentThread().getName()); System.out.println(Arrays.toString(Thread.class.getInterfaces())); }); t1.start(); }
6.4 实验总结
3.1:参考多线程PPT,只需设置守护线程即可。
3.2:参考多线程PPT,t1.start()
之后用使用t1.join()
。 4.1:定义一个MyThread
类继承自Thread
类,并按要求改写run方法。 4.2:设置boolean flag = false
,在调用stopMe()方法时,将flag置为true。再run方法里设置while循环,条件为(!this.flag)
,还要注意当word比较完了之后要将它置为null。 4.3:用匿名内部类Thread t1 = new Thread(new Runnable() {})
,在“{}”里面重写一下run()方法。- Q7:源代码阅读:多线程程序
7.1 哪个类是支持多线程的类,它实现了什么接口。这个类做了些什么?
答:BallRunnable类是支持多线程的类,实现了Runnable接口,让小球在界面上进行移动,再休眠一段时间。
7.2 Ball.java这个程序只做了两件事,这两件事分别是什么?
答:① 定义
② 定义public void move(Rectangle2D bounds)
方法,控制小球的移动;public Ellipse2D getShape()
方法,获得小球的位置和形状。7.3 BallComponent也只做了两件事,这两件事分别是什么?
答:① 定义
② 定义public void add(Ball b)
方法,添加小球。public void paintComponent(Graphics g)
方法,画出小球。7.4 BounceThread中,什么时候启动了新线程?
答:点击start按钮,调用addBall()方法,加入一个新的小球,启动新线程。
7.5 这个程序是如何实现?一个大致的执行流程是什么?
答:① 出现一个Bounce Thread界面。
② 点击start按钮,添加小球。并通过调用move方法和getShape方法实现小球的移动。 ③ 再次点击start,重复②步骤。 ④ 点击close关闭程序。- Q8:购物车系统中的多线程
8.1 购物车系统中可能存在哪些多线程问题?
答:每个账户都可以是一个线程,如果要让多个用户同时登录购物车系统,这时候就需要用到多线程。
3. 码云上代码提交记录及PTA实验总结
题目集:异常
、多线程
(3-1, 3-2, 4-1, 4-2, 4-3)