Java学习(七)

来源:互联网 发布:js中树形菜单制作方法 编辑:程序博客网 时间:2024/05/21 09:51

Java学习(七)

目录:

1、File类的createNewFile()方法

2、FileOutputStream的一个构造方法:

3、Javadoc的一些基本标记:

4、Thread线程API文档学习:

5、线程知识点

6、线程的生命周期:

7、什么叫守护程序和守护进程?

8、线程的优先级:

9、线程的调度策略:

10、什么是时间片?

11、Thread类学习:

12、练习:


1、File类的createNewFile()方法

答:public boolean createNewFile()throws IOException

当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。检查文件是否存在,若不存在则创建该文件,这是单个操作,对于其他所有可能影响该文件的文件系统活动来说,该操作是不可分的。

返回:如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回false。

 

2、FileOutputStream的一个构造方法:

答:FileOutputStream(File file, boolean append):创建一个向指定File对象表示的文件中写入数据的文件输出流。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。创建一个新FileDescriptor对象来表示此文件连接。

 

3、Javadoc的一些基本标记:

答:javadoc标记由“@+标记类型+专用注释引用组成

author:标明开发该类模块的作者

语法:@author name-text

version:标明该类模块的版本

语法:@version version-text

see:参考转向,也就是相关主题

语法:@see reference

param:对方法中某参数的说明

语法:@param parameter-name description

return:对方法返回值的说明

语法:@return description

exception:对方法可能抛出的异常进行说明

语法:@exception class-name description

⑦throws:对方法可能抛出的异常进行说明

语法:@throws class-name description

deprecated:告诉用户什么时候开始不鼓励使用该API以及使用什么替代它

语法:@deprecated deprecated-text

 

4、Thread线程API文档学习:

答:线程 是程序中的执行线程。Java虚拟机允许应用程序并发地运行多个执行线程。

每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。

Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的main方法)。Java虚拟机会继续执行线程,直到下列任一情况出现时为止:

调用了 Runtime 类的exit 方法,并且安全管理器允许退出操作发生。

非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到run方法之外的异常。

创建新执行线程有两种方法。

①将类声明为 Thread 的子类。该子类应重写Thread类的run方法。接下来可以分配并启动该子类的实例。

②声明实现 Runnable 接口的类。该类然后实现run方法。然后可以分配该类的实例,在创建Thread时作为一个参数来传递并启动。

 

5、线程知识点

答:(1)线程与多线程:

线程:程序中单独顺序的流控制。线程本身不能运行,它只能用于程序中。

多线程:在单个程序中可以同时运行多个不同的线程执行不同的任务。

(2)多线程编程的目的

"最大限度地利用CPU资源",当某一线程的处理不需要占用CPU而只和I/O等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。

(3)将我们希望线程执行的代码放到run方法中,然后通过start方法来启动线程,start方法首先为线程的执行准备好系统资源,然后再去调用run方法。当某个类继承了Thread类之后,该类就叫做一个线程类。

(4)两种生成方式注意事项:

Thread类也实现了Runnable接口,因此实现了Runnable接口中的run方法;

②当生成一个线程对象时,如果没有为其设定名字,那么线程对象的名字将使用如下形式:Thread-number(从0开始),该number将是自动增加的,并被所有的Thread对象所共享(因为它是static的成员变量)。

③当使用继承Thread类来生成线程对象时,我们需要重写run方法,因为Thread类的run方法此时什么事情也不做。

④当使用实现Runnable接口来生成线程对象时,我们需要实现Runnable接口的run方法,然后使用new Thread(new MyThread())(假如MyThread已经实现了Runnable接口)来生成线程对象,这时的线程对象的run方法就会调用MyThread类的run方法,这样我们自己编写的run方法就执行了。

(5)关于成员变量与局部变量:

如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程)。

如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他的线程。

(6)停止线程的方式:

不能使用Thread类的stop方法来终止线程的执行。一般要设定一个变量,在run方法中是一个循环,循环每次检查该变量,如果满足条件则继续执行,否则跳出循环,线程结束。

(7)synchronized关键字:

synchronized关键字修饰一个方法的时候,该方法叫做同步方法。

Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor),当访问某个对象的synchronized方法时,表示将该对象上锁,此时其他任何线程都无法再去访问该synchronized方法了,直到之前的那个线程执行方法完毕后(或者是抛出了异常),那么将该对象的锁释放掉,其他线程才有可能再去访问该synchronized方法。

如果一个对象有多个synchronized方法,某一时刻某个线程已经进入到了某个synchronized方法,那么在该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法的。

(8)Java中如果我们自己没有产生线程,那么系统就会给我们产生一个线程(主线程,main方法就在主线程上运行),我们的程序都是由线程来执行的。

(9)多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响。

(10)线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。

(11)多线程程序比多进程程序需要更少的管理费用。进程是重量级的任务,需要分配给它们独立的地址空间。进程间通信是昂贵和受限的。进程间的转换也是很需要花费的。另一方面,线程是轻量级的选手。它们共享相同的地址空间并且共同分享同一个进程。线程间通信是便宜的,线程间的转换也是低成本的。


6、线程的生命周期:

(1)①创建状态:

当用new操作符创建一个新的线程对象时,该线程处于创建状态。处于创建状态的线程只是一个空的线程对象,系统不为它分配资源

②可运行状态:

执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体—run()方法,这样就使得该线程处于可运行( Runnable )状态。

这一状态并不是运行中状态(Running ),因为线程也许实际上并未真正运行。

③不可运行状态:

④消亡状态:

当线程的run方法执行结束后,该线程自然消亡。

(2)当发生下列事件时,处于运行状态的线程会转入到不可运行状态。

①调用了sleep()方法;

②线程调用wait方法等待特定条件的满足

③线程输入/输出阻塞

(3)返回可运行状态:

①处于睡眠状态的线程在指定的时间过去后

②如果线程在等待某一条件,另一个对象必须通过notify()notifyAll()方法通知等待线程条件的改变

③如果线程是因为输入/输出阻塞,等待输入/输出完成


7、什么叫守护程序和守护进程?

答:守护程序:是一种计算机进程它的工作就是"监听"想要更多特殊网络服务的连接处理所有被除数认为是套接字尝试的临时连接的合法尝试。

守护进程:也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

 

8、线程的优先级:

答:设置优先级是为了在多线程环境中便于系统对线程的调度,优先级高的线程将优先执行。

一个线程的优先级设置遵从以下原则:

①线程创建时,子继承父的优先级

②线程创建后,可通过调用setPriority()方法改变优先级。

③线程的优先级是1-10之间的正整数。

1 - MIN_PRIORITY,

10 MAX_PRIORITY

5- NORM_PRIORITY

 

9、线程的调度策略:

答:线程调度器选择优先级最高的线程运行。但是,如果发生以下情况,就会终止线程的运行。

①线程体中调用了yield()方法,让出了对CPU的占用权

②线程体中调用了sleep()方法,使线程进入睡眠状态

③线程由于I/O操作而受阻塞

④另一个更高优先级的线程出现。

⑤在支持时间片的系统中,该线程的时间片用完。

 

10、什么是时间片?

答:时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。

 

11、Thread类学习:

(1)①代码段示例:

 

图11.1 Thread类示例代码

②运行结果:

 

图11.2 运行结果

以上说明:GetID返回线程的标识符,是一个long类型的整数;

没有为线程起名字时,默认起名“Thread + number

优先级默认为5

 

(2)①代码段示例:

测试两个线程同时运行:

 

图11.3 两个Thread对象同时运行

②运行结果:

 

图11.4 运行结果

 

(3)①代码段示例:

实现runnable接口来生成线程对象

 

图11.5 程序示例

②运行结果:

 

图11.6 运行结果

说明:如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程)。如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他的线程。

 

12、练习:

答:(1)在一个文件中用计时器实现延迟的输入

①代码示例:

a)使用Timerschedule方法安排任务开始进行重复的两秒固定延迟执行。

b)重写其run方法,在文件中输入"" + i + "次在文件里输出"

c)输入30次后停止

 

图12.1 代码示例1


图12.2 代码示例2

②运行结果:

 

图12.3 运行结果1


图12.4 运行结果2


5 0
原创粉丝点击