20165202 2017-2018-2 《Java程序设计》第8周学习总结
20165202 2017-2018-2 《Java程序设计》第8周学习总结
教材学习内容总结
Ch12
-
进程与线程
- 线程是比进程更小的单位,一个进程在其执行过程中,可以产生多个线程
-
Java中的线程
-
主线程
每个Java应用程序都有一个缺省的主线程。当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称为“主线程”(main线程),该线程负责执行main方法。
-
线程的状态与生命周期
Java语言使用Thread类及其子类的对象表示线程
新建的线程在它的一个完整的生命周期中通常要经历如下的四种状态:
1.新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。
2.运行 :线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。一旦轮到它来享用CPU资源时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了。
3.中断:有4种原因的中断:
JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。
线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状。
线程使用CPU资源期间,执行了wait()方法。
线程使用CPU资源期间,执行某个操作进入阻塞状态。
4.死亡 :处于死亡状态的线程不具有继续运行的能力,释放分配给线程对象的内存
-
-
Thread类与线程的创建
-
在Java语言中,用Thread类或子类创建线程对象,编写子类时,需要重写run()方法。
-
使用Thread类:Thread(Runnable target)
Example12-3、4
-
-
线程的常用方法
- start(): 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。
- run(): Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。
- sleep(int millsecond): 优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。
- isAlive(): 线程处于“新建”状态时,线程调用isAlive()方法返回false。在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。
- currentThread():该方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。
- interrupt() :一个占有CPU资源的线程可以让休眠的线程调用interrupt()方法“唤醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠。
-
线程同步
- 若干个线程需要同时使用一个方法,需要使用synchronized进行修饰。 当一个线程使用synchronized方法时,其他线程若想使用就必须使用wait()方法等待,直到该线程使用完该方法
- 其他线程在使用同步方法时若不需要等待,则用完方法的同时,执行notifyAll()方法通知所有处于等待状态的线程结束等待。
-
协调同步的线程
-
wait() 方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。
-
notifyAll() 方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。曾中断的线程就会从刚才的中断处继续执行这个同步方法,并遵循“先中断先继续”的原则。
-
notify() 方法只是通知处于等待中的线程的某一个结束等待。
不可以在非同步方法中使用wait(),notify(),notifyAll()方法。
-
-
线程联合
- 一个线程A在占有CPU资源期间,可以让其它线程调用join()和本线程联合,如:
B.join();
称A在运行期间联合了B。 - 如果线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行。
- 如果A准备联合的B线程已经结束,那么B.join()不会产生任何效果。
- 一个线程A在占有CPU资源期间,可以让其它线程调用join()和本线程联合,如:
-
GUI线程
- 当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序会自动启动更多的线程
- AWT-EventQuecue线程负责处理GUI事件
- AWT-Windows线程负责将窗体或组件绘制到桌面
-
计时器线程
-
计时器线程
构造方法:
Timer(int a,object b)
,a的单位为毫秒,b是计时器的监视器只震铃一次:调用setReapeats(boolean b)方法,b取值false
启动计时器:
start()
停止计时器:
stop()
重启计时器:
restart()
-
-
守护线程
- 线程可以调用void setDaemon(boolean on)方法将自己设置成一个守护线程。
- 必须在运行之前设置自己是否守护线程。
代码调试中的问题和解决过程
-
问题1:上周的MySql一直没有装好
-
问题1解决方案:参考娄老师的博客XMAPP安装到这一步找不到相应入口
应该从 127.0.0.1
进入后选择红框内 phpMyAdmin
代码托管
上周考试错题总结
1.接口RowSet继承了接口__,可以调用RowSet中的方法__来填充其数据区。
①Statement ②ResultSet ③update ④populate
A . ①③
B . ①④
C . ②③
D . ②④
正确答案: C
解析:populate方法只能用来写入数据
2.下列属于数据操作语言的是
A . insert
B . update
C . create
D . select
正确答案: A B
我的答案:A B D
解析:本题我不太理解为什么没有D,按照百度百科关于数据操纵语言的定义,select也应该属于操作语言呀?
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 24/24 | 1/4 | 15/15 |
第二周 | 423/423 | 2/6 | 14/29 |
第三周 | 702/1109 | 1/7 | 16/45 |
第四周 | 918/2027 | 2/9 | 16/61 |
第五周 | 1208/3235 | 2/11 | 15/76 |
第六周 | 1137/4372 | 2/13 | 14/90 |
第七周 | 549/4921 | 1/14 | 10/100 |
第八周 | 1025/5946 | 3/17 | 15/115 |