201711671125 《Java程序设计》第十二章学习总结

教材学习内容总结

第十二章

  1. Java中的线程

多线程是指一个应用程序中同时存在几个执行体,按几条不同的执行线索共同工作的情况。

1.1主线程

每个Java应用程序都会有一个缺省的主线程。当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称为“主线程”(main线程),该线程负责执行main方法。在main方法中再创建的线程,就称为程序中的其它线程。JVN要等到Java应用程序中的所有线程都结束之后,才结束Java应用程序。

1.2线程的状态与生命周期

Java语言使用Thread类及其子类的对象来表示线程。

  1. 新建

当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时,它已经有了相应的内存空间和其他资源。

  1. 运行

当JVM将CPU使用权切换给该线程时,此线程就可以脱离创建它的主线程独立开始自己的生命周期。

  1. 中断
    • CPU资源被切换给其他线程
    • 执行了sleep(int millsecond)方法,线程进入休眠状态。
    • 执行了wait()方法,线程进入等待状态。
    • 执行某个操作进入阻塞状态。
  2. 死亡

处于死亡状态的线程不具有继续运行的能力。死亡原因有两个,一个是正常运行的线程完成了它的全部工作;另一个是线程被提前终止。

1.3线程调度与优先级

JVM的线程调度器的任务是使高优先级的线程能始终运行,一旦时间片有空闲,则使具有同等优先级的线程以轮流的方式顺序使用时间片。

要等到高优先级线程执行完毕今日死亡状态,才会在其他优先级的线程中轮流切换。

  1. Thread类与线程的创建

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。

一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体,由于线程只能引用最后分配的实体,先前的实体就会成为“垃圾”,并且不会被垃圾收集器收集掉。

  1. currentThread()

currentThread()方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。

  1. interrupt()

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版)》

猜你喜欢

转载自blog.csdn.net/Ulong_/article/details/84501282