201711671233《Java程序设计》第12周学习总结
一、教程学习内容总结
这周主要学习了线程,Thread类与线程的创建,线程常用方法,线程同步,协调同步的线程,线程联合,GUI线程,计时器线程。
(一)线程
进程是程序的一次动态执行过程,对应了从代码加载、执行至执行完毕的一次完整过程,这个过程也是进程本身从产生、发展至消亡的过程。
线程是比进程更小的执行单位。一个进程在执行过程中,可以产生多个线程,形成多条线索。
没有进程就没有线程。
(二)多线程
多线程是指一个应用程序中同时存在几个执行体,按几条不同的执行线索共同工作的情况。但计算机在任何给定时刻只能执行那些线程中的一个。Java虚拟机快速地把控制从一个线程切换到另一个线程,给人一种几件事同时发生的感觉。
每个Java应用程序都有一个缺省的主线程。
(三)Thread类与线程的创建
用Thread子类或子类创建线程对象。Thread类的子类不能再扩展其他的类(Java不支持多继承)。
线程间可以共享相同的内存单元(包括数据和代码),可以利用共享单元来实现数据交换、实时通信与必要的同步操作。
(四)线程的常用方法
1、start()
调用start()方法启动线程,使之从新建状态进入就绪队列排队。
只有处于新建状态的线程才能调用start()方法,调用后开始排队等待CPU资源。
2、run()
Thread类的run()和Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作。
当run方法执行完毕后,线程就变成死亡状态。死亡状态就是线程释放了实体,即释放分配给线程对象的内存。
3、sleep(int millsecond)
线程的调度执行是按照其优先级的高低顺序执行的,当级别高的线程未死亡是,级别低线程没有机会获得CPU资源。
有时需要优先级高的线程让出CPU资源,使优先级第的线程有机会执行。此时,优先级高的线程可以可以在他的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。休眠时间长短由sleep方法的参数决定,millsecond是以毫秒为单位的休眠时间。
4、isAlive()
线程处于新建状态时,线程调用isAlive()方法返回false。
当线程调用start()方法,并占有CPU资源后,该线程的run()方法就开始运行,在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。进入死亡状态后(实体内存被释放),线程仍可以调用isAlive()方法,此时返回false。
(五)线程同步
线程同步就是若干个线程都需要使用一个synchronized(同步)修饰的方法,即线程中的若干个线程都需要使用一个方法,而这个方法用synchronized给予了修饰。多个线程调用synchronized方法必须遵守同步机制。
线程同步机制:当一个线程A使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到线程A使用完该synchronized方法。
(六)协调同步的线程
wait()方法可以中断线程的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。
其他线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的同时,应当用notifyAll()方法通知所有由于使用这个同步方法而处于等待的线程结束等待,曾终断的线程就会从刚才的中断处继续执行这个同步方法,并遵循“先中断先继续”的原则。
如果使用notify()方法,那么只是通知处于等待中的线程的某一个结束等待。
wait()、notifyAll()和notify()方法都是Object类中的final方法,被所有的类继承且不允许重写的方法。不可以在非同步方法中使用wait()、notifyAll()和notify()方法!
(七)线程联合
一个线程A在占有CPU资源期间,可以让其他线程调用join()和本线程联合。如:B.join(); (A在运行期间联合了B)
如果线程A在占有CPU资源期间一旦联合了B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程在重新排队等待CPU资源,以便恢复执行。如果A准备联合的B线程已经结束,那么B.join();不会产生任何效果。
(八)GUI线程
当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中两个重要线程:AWT-EventQuecue和AWT-Windows。
AWT-EventQuecue线程负责处理GUI事件。
AWT-Windows线程负责将窗体或组件绘制到桌面。
(九)计时器线程
当某些操作需要周期性地执行,就可以使用计时器。
Timer类的构造方法Timer(int a,Object b)创建一个计时器。参数a的单位是毫秒,参数b是计时器的监视器。
使用Timer类的方法start()启动计时器,即启动线程。
使用Timer类的方法stop()停止计时器,即挂起线程。使用restart()重新启动计时器,即恢复线程。
计时器的监视器必须是组件类(如JFrame、JButton等)的子类的实例,否则无法启动计时器。
二、学习进度条
| 代码行数 (新增/累计) | 博客量 (新增/累计) | 学习时间 (新增/累计) |
目标 | 2500行 | 10篇 | 200小时 |
第一周 | 30 | 1 | 10 |
第二周 | 30/60 | 1/2 | 10/20 |
第三周 | 30/90 | 1/3 | 10/30 |
第四周 | 30/120 | 1/4 | 10/40 |
第五周 | 30/150 | 1/5 | 10/50 |
第六周 | 30/180 | 1/6 | 10/60 |
第七周 | 50/230 | 1/7 | 10/70 |
第八周 | 100/330 | 1/8 | 10/80 |
第九周 | 100/430 | 1/9 | 10/90 |
第十周 | 200/630 | 1/10 | 10/100 |
第十一周 | 270/900 | 1/11 | 10/110 |
第十二周 | 300/1200 | 1/12 | 10/120 |
三、参考资料
Java2实用教程(第5版)