20165227 2018-4 《Java程序设计》第八周学习总结
教材学习内容总结
第十二章
- Thread类:在编写Thread类的子类的时候,需要重写父类的run()方法,其目的是规定线程的具体操作,否则线程什么都不做,因为父类的run()方法中没有任何操作语句
- 使用Thread类子类创建线程:在main方法中创建和启动线程,然后在Thread子类中重写run()方法,规定具体操作。结果按照main线程、子类线程的顺序实行
public class SpeakCar extends Thread {
public void run() {
}
}
- 使用Thread类直接创建线程:使用构造方法Thread(Runnable target)来创建;该构造方法中的参数是一个Runnable类型的接口
public class ElephantTarget implements Runnable {
public void run() {
}
}
- 目标对象与线程的关系:
- 完全解耦:创建目标对象中并没有不包含对线程对象的引用,需要使用
String name = Thread.currentThread().getName();
- 弱解耦:当创建目标对象的类组合线程对象时,目标对象可以通过获得线程对象的引用
Thread.currentThread();
在创建目标对象的类中声明
House() {
dog=new Thread(this); //当前House对象作为线程的目标对象
cat=new Thread(this);
}
-
run方法在程序执行的过程中可以多次启动
-
线程的常用方法;
start()
启动线程;
sleep(int millsecond)
休眠线程;
isAlive()
判断当前线程的状态,false or true;
currentThread()
返回当前正在使用的线程;
interrupt()
唤醒处于休眠的线程
-
线程同步:需要使用用
synchronized
修饰的方法
public synchronized void saveOrTake(int amount) { }
-
线程联合:
join()
方法 -
GUI线程:
AWT-EventQuecue
和AWT-Windows
两个重要的线程
教材学习中的问题和解决过程
- 问题1:一个线程的run()方法的执行过程中为什么随时可能被强行中断
- 问题1解决方案:通过教材的学习,了解到这个跟JVM的轮流执行线程的机制有关,在执行一个线程的时候会遇到比如
System.out.println("线程执行");
时候会中断对CPU的使用权 - 问题2:GUI是什么?
- 问题2解决方案:参考百度:GUI
代码调试中的问题和解决过程
-
问题1:在编译教材中的代码的时候出现
IllegalThreadStateException异常
的提示 -
问题1解决方案:通过反复检查和结合教材的知识,了解了不能在线程没有结束run()方法之前调用start()方法,否则就会出现这样的错误提示
-
问题2:运行教材代码出现两行相同的时间
-
问题2解决方案:代码中,在一个已经运行的线程还没有进入死亡状态之前,给其再次分配了实体,导致先前的实体成为了不能收集掉的“垃圾”,但依旧会被JVM认为正在运行,所以产生了错误
代码托管
上周考试错题总结
其他(感悟、思考等,可选)
在这一周的学习中知道了Java的多线程运行,同时也复习了接口、父类子类等之前的知识点,发现对于Java的学习已经开始融会贯通了,所以对于之前的知识就更不能懈怠,需要不断的温习才行
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 210/210 | 1/1 | 20/20 | |
第二周 | 240/450 | 1/2 | 18/38 | |
第三周 | 496/946 | 1/3 | 22/60 | |
第四周 | 624/1570 | 1/4 | 30/90 | |
第五周 | 843/2413 | 1/5 | 24/114 | |
第六周 | 733/3146 | 1/6 | 20/134 | |
第七周 | 628/3774 | 1/7 | 21/155 | |
第八周 | 1103/4877 | 1/8 | 30/185 |