- 教材学习内容总结
第十二章:
java多线程机制:
java语言的一大特性就是内置对多线程的支持,新建的线程要经历4中状态:新建、运行、中断以及死亡。
线程的优先级可以通过setPriority(int grade)方法调整,该方法需要一个int类型参数。
在编写Thread类的子类时,要重写弗雷德run()方法,其目的是规定现成的具体操作,否则线程什么也不做,因为父类的run()方法中没有任何操作语句。
线程的常用方法:start()方法:只有新建状态的线程才可以调用start()方法,调用之后开始排队等待CPU资源了。
Run()方法:当run方法执行完毕,线程就变成死亡状态,在线程没有结束run()方法之前,不赞成让线程再调用start()方法。
Sleep(int millsecond):线程的调度执行是按照其优先级的高低顺序进行的,当高级别的线程未死亡时,低级别线程没有机会获得CPU资源。
isAlive()方法:在线程的run()方法结束之前,既没有进入死亡状态之前,线程调用isAlive()
方法返回true。在线程进入死亡状态后,线程仍可以调用方法isAlive(),这时返回的值为false。
currentThread()方法:是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。
Interrupt()方法:interrupt方法经常用来“吵醒”休眠的线程。
线程同步:java程序中可以存在多个线程,但是在处理多线程问题时,必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量。程序应对这样的问题做出处理,否则可能发生混乱。
协调同步的线程:应当用notifyAll()方法通知所有由于使用这个同步方法而处于等待的线程结束,遵循“先中断先继续”的原则。
计时器线程:Timer类在javax.swing包中(在java.util包中也有),注意计时器的监视器必须是组件类(例如JFrame、JButton等)的子类的实例,否则计时器无法启动。
二、教材中的学习问题和解决过程
1、建立线程有几种方法?
两种方法:用Thread类或其子类。
- 怎样设置线程的优先级?
使用setPriority(int grade)方法。
- 在多线程中,为什么要引入同步机制?
java程序中可以存在多个线程,但是在处理多线程问题时,必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量。程序应对这样的问题做出处理,否则可能发生混乱。
- 线程在什么状态时调用isAlive()方法返回的值是false?
新建和死亡状态。
三、代码调试中的问题和解决过程
1、在同一个程序中,分别使用start()和run(),会出现怎么样的结果?
当使用start()时,JVM会认为这个应用程序共有两个线程;当使用run()时,JVM认为这个应用程序只有一个主线程。
- 在两个程序中,计时器的启动一个是成功,一个是失败的,这是为什么?
在第一个程序中,class A是组件类的子类,所以程序结果是正常的,而后面那一个是只是实现了接口,就是监视器,从而在运行结果中没有出现我们想要的计时器。
四、其他(感悟)
在自学第十二章内容的时候,发现很多程序其实都是差不多的,只是要注意的地方也是很多,特别是在程序中使用start()方法和run()方法时,程序结果完全不一样;然后就是在同一个程序中同时出现它们两个的时候,会发现一个很奇妙的结果,例如课后习题第三大题的第三和第四个程序,第四个程序创建多了一个Target对象,然后结果跟第三个程序的完全不一样。
五、学习进度条
| 代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 |
目标 | 5000行 | 30篇 | 400小时 |
|
第一周 | 10行 | 1篇 | 3小时 |
|
第二周 | 20行 | 2篇 | 10小时 |
|
第三周 | 20行 | 3篇 | 10小时 |
|
第四周 | 30行 | 4篇 | 3小时 |
|
第五周 | 50行 | 5篇 | 5小时 |
|
第六周 | 10行 | 6篇 | 5小时 |
|
第七周 | 10行 | 7篇 | 5小时 |
|
第八周 | 10行 | 8篇 | 5小时 |
|
第九周 | 10行 | 9篇 | 5小时 |
|
第十周 | 10行 | 10篇 | 3小时 |
|
第十一周 | 20行 | 11篇 | 5小时 |
|