教材学习内容总结
第十二章
多线程是指一个应用程序中同时存在几个执行体,按几条不同的执行线索共同工作的情况。
1.1主线程
每个Java应用程序都会有一个缺省的主线程。当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称为“主线程”(main线程),该线程负责执行main方法。在main方法中再创建的线程,就称为程序中的其它线程。JVN要等到Java应用程序中的所有线程都结束之后,才结束Java应用程序。
1.2线程的状态与生命周期
Java语言使用Thread类及其子类的对象来表示线程。
当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时,它已经有了相应的内存空间和其他资源。
当JVM将CPU使用权切换给该线程时,此线程就可以脱离创建它的主线程独立开始自己的生命周期。
处于死亡状态的线程不具有继续运行的能力。死亡原因有两个,一个是正常运行的线程完成了它的全部工作;另一个是线程被提前终止。
1.3线程调度与优先级
JVM的线程调度器的任务是使高优先级的线程能始终运行,一旦时间片有空闲,则使具有同等优先级的线程以轮流的方式顺序使用时间片。
要等到高优先级线程执行完毕今日死亡状态,才会在其他优先级的线程中轮流切换。
2.1使用Thread的子类
用Thread类或子类创建线程对象。
2.2使用Thread类
优点:可以在子类中增加新的成员变量,使线程具有某种属性,也可以在子类中新增加方法,使线程具有某种功能。
创建线程的另一个途径就是用Thread类直接创建线程对象。
对于Thread(Runnable target)构造方法创建的线程,轮到 它来享用CPU资源时,目标对象就会自动调用接口中的run()方法。
2.3目标对象与线程的关系
(1)目标对象和线程完全解耦
(2)目标对象组合线程(弱耦合)
3.线程的常用方法
(1)strat()
线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。
只有处于新建状态的线程才可以调用start()方法。
(2)run()
Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作。
在线程没有结束run()方法之前,不赞成让线程再调用start()方法,否则将发生异常。
(3)sleep(int millsecond)
当高级别的线程未死亡时,低级别线程没有机会获得CPU资源。当优先级高的线程需要优先级低的线程做一些工作来配合它,或者优先级别高的线程需要完成一些费时的操作,此时优先级高的线程应该让出CPU资源,使优先级低的线程有机会执行。需要在run()方法中调用sleep()方法来使自己放弃CPU资源。必须在try-catch语句块中调用sleep方法。
(4)isAlive()
线程处于新建状态时,线程调用isAlive()方法返回false。没有进入死亡状态之前,线程调用isAlive()方法返回true。当线程进入死亡状态后,线程仍可以调用方法isAlive(),这时返回的值是false。
一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体,由于线程只能引用最后分配的实体,先前的实体就会成为“垃圾”,并且不会被垃圾收集器收集掉。
currentThread()方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。
interrupt方法经常用来“吵醒”休眠的线程。
4.线程同步
所谓线程同步就是若干个线程都需要使用一个synchronized(同步)修饰的方法,即程序中的若干个线程都需要使用一个方法,而这个方法用synchronized方法给予修饰。多个线程调用synchronized方法必须遵守同步机制。
当一个线程使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到前一个线程使用完该synchronized方法。
5.协调同步的线程
当一个线程使用的同步方法中用到某个变量,而此变量又需要其他线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。Wait方法可以中断线程的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。
6.线程联合
一个线程在占有CPU资源期间,可以让其他线程调用join()和本线程联合。一旦联合另外的线程,那么此线程将立刻中断执行,一直等到它联合的线程执行完毕,再重新排队等待CPU资源,以便恢复执行。
7.GUI线程
AWT-EventQuecue线程负责处理GUI事件,AWT-Windows线程将负责将窗体或组件绘制到桌面。
8.计时器线程
当某些操作需要周期性地执行,就可以使用计时器。
创建后,使用Timer类的方法strat()启动计时器,即启动线程。Stop()停止计时器,即挂起线程。使用restart()重启计时器,即恢复线程。
计时器的监视器必须是组件类的子类的实例,否则计时器无法启动。
9.守护线程
线程默认是非守护线程,也成用户线程,一个线程调用void setDaemon(Boolean on)方法可以将自己设置成一个守护线程。
当初程序中所有用户线程都已运行结束时,即守护线程的run方法还有需要执行的语句,守护线程也立刻结束运行。
教材学习中的问题和解决过程
相对于之前的内容,线程的内容还是比较容易理解的。
代码调试中的问题和解决过程
结合eclipse的提示进行程序的修改,一般不会有大问题。
其他
例题运行截图
Example12_1
Example12_2
Example12_3
Example12_4
Example12_5
Example12_6
Example12_7
Example12_8
Example12_9
Example12_10
Example12_11
Example12_12
Example12_13
Example12_14
学习进度条
代码行数(新增) |
博客量(新增) |
学习时间(新增) |
重要成长 |
429行 |
1篇 |
8小时 |
|
参考资料
《Java2实用教程(第5版)》