Java语言程序设计复习考试题带答案三.docx
- 文档编号:28916594
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:35
- 大小:30.64KB
Java语言程序设计复习考试题带答案三.docx
《Java语言程序设计复习考试题带答案三.docx》由会员分享,可在线阅读,更多相关《Java语言程序设计复习考试题带答案三.docx(35页珍藏版)》请在冰豆网上搜索。
Java语言程序设计复习考试题带答案三
《Java语言程序设计基础教程》
练习思考题参考答案
第7章多线程
7.1单项选择题
1、Java语言具有许多优点和特点,下列选项中,哪个反映了Java程序并行机制的特点?
( )
A、安全性B、多线程
C、跨平台D、可移植
解答:
B
2、Runnable接口中的抽象方法是()。
A、startB、stop
C、yieldD、run
解答:
D
3、有以下程序段(很难)
classMyThreadextendsThread{
publicstaticvoidmain(Stringargs[]){
MyThreadt=newMyThread();
MyThreads=newMyThread();
t.start();
System.out.print("one.");
s.start();
System.out.print("two.");
}
publicvoidrun(){
System.out.print("Thread");
}
}
则下面正确的选项是()
A、编译失败
B、程序运行结果为:
one.Threadtwo.Thread
C、程序运行结果是:
one.two.ThreaThread
D、程序运行结果不确定
解答:
D
5、作为类中新线程的开始点,线程的执行是从下面哪个方法开始的。
( )
A、publicvoidstart()
B、publicvoidrun()
C、publicvoidint()
D、publicstaticvoidmain(Stringargs[])
解答:
A
6、Java中用于给对象加“互斥锁”标记的关键字是。
( )
A、synchronized
B、serialize
C、transient
D、static
解答:
A
7.以下哪个方法用于定义线程的执行体?
(C)
A、start()B、init()
C、run()D、synchronized()
8.以下哪个关键字可以用来为对象加互斥锁?
(D)
A、transientB、static
C、serializeD、synchronized
7.2填空题
7.3简答题
1、多线程有几种实现方法,都是什么?
同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。
用Thread类的子类创建线程对象,也就是从Thread类继承。
实现Runnable接口,用Thread类直接创建线程对象。
同步的实现方面有两种,分别是synchronized,wait与notify。
2、创建一个新线程的方法,可以使用下面哪2种()
A、继承java.lang.Thread类,并且重载run方法。
B、继承java.lang.Runnable类,并且重载start方法。
C、实现java.lang.thread类,实现run方法。
D、实现java.lang.Runnable接口,实现run方法。
E、实现java.lang.Thread类,实现start方法。
解答:
A,D
3、线程在它的一个完整的生命周期中有哪4种状态?
解答1:
线程在它的一个完整的生命周期中通常要经历如下的4种状态:
1.创建状态(newThread)2.可运行状态(Runnable)3.不可运行状态(NotRunnable)4.死亡状态(Dead)
解答2:
第一是创建状态。
在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就绪状态。
当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。
在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行状态。
线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞状态。
线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。
sleep,suspend,wait等方法都可以导致线程阻塞。
第五是死亡状态。
如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。
对于已经死亡的线程,无法再使用start方法令其进入就绪。
4、线程在什么状态时,调用isAlive()方法返回的值是false。
5、建立线程有哪两种方法?
解答:
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。
6、怎样设置线程的优先级?
7、调用Thread类的什么方法可以启动一个线程?
直接调用Thread类的run()方法可以启动一个线程吗?
解答:
线程调用start()方法将启动线程,从新建状态进入就绪队列排队。
不能直接调用Thread类的run()方法可以启动一个线程,我们调用了Thread的run()方法,它的行为就会和普通的方法调用一样。
8、Thread类中的start()和run()方法有什么区别?
解答:
这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。
当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。
9、进程和线程的区别?
解答:
进程=执行中的程序,每个进程都有自己独立的一块内存、一组系统资源。
每一个进程的内部数据和状态都是完全独立的。
线程=进程中单个顺序的流控制,同类的多个线程共享一块内存、一组系统资源。
线程的运行开销很小。
一个线程是进程的一个执行流程,一个进程可以同时包含多个线程。
10、现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
解答:
在T2线程的run()方法中加入代码T1.join,在T3线程的run()方法中加入代码T2.join。
或者在主线程main()方法中,
t1.start();
try{
t1.join();
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
t2.start();
try{
t2.join();
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
t3.start();
11、Thread.start()与Thread.run()有什么区别?
解答:
通过调用Thead类的start()方法来启动一个线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法。
直接使用run()方法叫做方法调用,不能启动线程。
12、在一个对象上两个线程可以调用两个不同的同步实例方法吗?
解答:
不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。
所以只有执行完该方法释放对象锁后才能执行其它同步方法。
13、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?
解答:
可以,一个非同步方法总是可以被调用而不会有任何问题。
实际上,Java没有为非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。
如果一个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查是否安全,所以在这种情况下要特别小心。
一个方法是否声明为同步取决于临界区访问(critialsectionaccess),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。
14、wait方法的作用?
解答:
wait方法用在synchronized方法或者synchronized块中。
一般在判断语句中,如果某条件被触发,让当前线程wait并释放对象的锁。
此时可以让其他线程可以对用以对象调用synchronized方法。
直到调用notify或者notifyAll后wait的线程才有可能执行。
所以一般wait和notify是成对出现的。
15、启动一个线程是用run()还是start(),调用的时候有什么区别?
(同第8题)
解答:
当然是start()了,当调用线程的start()方法的时候,线程就会进入到就绪状态。
run()方法是线程的执行入口,当线程从就绪状态进入到执行状态时首先要从run()方法开始执行。
当然,我们也是可以直接通过线程对象调用该对象的run()方法的,只是这只是一次普通的调用,并没有启动任何一个线程。
当我们调用start()方法时,是另外启动了一个线程去执行线程类的代码,并不影响主程序的执行,但是调用run()方法的时候要等待run()方法内的代码执行完主程序才可以向下执行
16、 sleep()和wait()有什么区别?
解答:
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
7.4综合题
14、编写一个死锁程序?
15、在下面的代码区填入相应的代码,实现以下功能:
通过继承Thread类的子类Thread1,来创建和启动一个线程t1;
通过实现Runnable接口的具体类Runner1,来创建和启动一个线程t2;
publicclassTestThread1{
publicstaticvoidmain(String[]args){
//创建和启动一个线程t1,在下面写出相应代码
Thread1t1=newThread1();
t1.start();
//创建和启动一个线程t2,在下面写出相应代码
Runner1r1=newRunner1();
Threadt2=newThread(r1);
t2.start();
for(inti=0;i<100;i++){
System.out.println("MainThread:
......"+i);
}
}
}
classRunner1implementsRunnable{
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println("Runner1:
......"+i);
}
}
}
classThread1extendsThread{
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println("Thread1:
......"+i);
}
}
}
16、现在有T1T2T3三个线程,怎样保证T2在T1执行完之后执行T3在T2执行完之后执行。
请在相应区域写出实现该功能的代码。
publicclassJoinDemo{
publicstaticvoidmain(String[]args){
T1t1=newT1("T1");
T2t2=newT2("T2");
T3t3=newT3("T3");
t1.start();
try{
t1.join();
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
t2.start();
try{
t2.join();
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
t3.start();
}
}
classT1extendsThread{
privateStringname;
publicT1(Stringname){
this.name=name;
}
publicvoidrun(){
for(inti=0;i<5;i++){
try{
sleep(5);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println(this.name+"循环"+i);
}
}
}
classT2extendsThread{
privateStringname;
publicT2(Stringname){
this.name=name;
}
publicvoidrun(){
for(inti=0;i<5;i++){
try{
sleep(5);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println(this.name+"循环"+i);
}
}
}
classT3extendsThread{
privateStringname;
publicT3(Stringname){
this.name=name;
}
publicvoidrun(){
for(inti=0;i<5;i++){
System.out.println(this.name+"循环"+i);
}
}
}
第8章文件和流
8.1单项选择题
1、创建一个向文件“file.txt”追加内容的输出流对象的语句是()。
A.OutputStreamout=newFileOutputStream(“file.txt”);
B.OutputStreamout=newFileOutputStream(“file.txt”,“append”);
C.FileOutputStreamout=newFileOutputStream(“file.txt”,true);
D.FileOutputStreamout=newFileOutputStream(newfile(“file.txt”));
解答:
C
2、下面哪个流类属于面向字符的输入流()
ABufferedWriterBFileInputStream
CObjectInputStreamDInputStreamReader
答案:
D
3、以下关于File类说法错误的是(D)
A.一个File对象代表了操作系统中的一个文件或者文件夹
B.可以使用File对象创建和删除一个文件
C.可以使用File对象创建和删除一个文件夹
D.当一个File对象被垃圾回收时,系统上对应的文件或文件夹也被删除
4、为了提高读写性能,可以采用什么流?
(D)
AInputStream
BDataInputStream
COutputStream
DBufferedInputStream
5、File类型中定义了什么方法来判断一个文件是否存在?
(D)
AcreateNewFile
BrenameTo
Cdelete
Dexists
6、File类型中定义了什么方法来创建多级目录?
(C)
AcreateNewFile
Bexists
Cmkdirs
Dmkdir
7、(Buffered流,缓冲区)有下面代码
importjava.io.*;
publicclassTestBufferedWriter{
publicstaticvoidmain(Stringargs[])throwsException{
FileWriterfw=newFileWriter(“test.txt”);
BufferedWriterbw=newBufferedWriter(fw);
Stringstr=“HelloWorld”;
bw.write(str);}}
在处放入什么代码,能够使得test.txt文件被正确写入?
A.bw.close()B.bw.flush();C.fw.close();
8.2填空题
1、对于FileInputStream来说,从方向上来分,它是____输入_____流,从数据单位上分,它是___字节___流。
2、创建FileOutputStream对象时,如果对应的文件在硬盘上不存在,则会_自动创建___;如果对应的文件在硬盘上已经存在,则__覆盖______
8.3简答题
1、java中有几种类型的流?
JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
解答:
字节输入流:
InputStream,字节输出流:
OutputStream
字符输入流:
Reader,字符输出流:
Writer
2、什么是java序列化,如何实现java序列化?
解答:
Java对象的序列化指将一个java对象写入OI流中,与此对应的是,对象的反序列化则从IO流中恢复该java对象。
如果要让某个对象支持序列化机制,则必须让它的类是可序列化的,为了让某个类是可序列化的,该类必须实现Serializable接口或Externalizable接口。
8.4综合题
3、FileInputStream流的read方法和FileRead流的read方法有何不同?
4、BufferedReader流能直接指向一个文件对象吗?
1、(FileInputStream和FileOutputStream)利用FileInputStream和FileOutputStream,完成下面的要求:
1)用FileOutputStream在当前目录下创建一个文件“test.txt”,并向文件输出“HelloWorld”,如果文件已存在,则在原有文件内容后面追加。
2)用FileInputStream读入test.txt文件,并在控制台上打印出test.txt中的内容。
3)要求用try-catch-finally处理异常,并且关闭流应放在finally块中。
FileInputStreamfin;
FileOutputStreamfon;
try{
fin=newFileInputStream("hello.txt");
on=newFileOutputStream("test.txt",true);
fon.write(“HelloWorld”);
System.out.println(fin.read());
fin.close();
}catch(Exceptione){}finally{fin.close();}
1、使用FileInputStream类,编写一个程序,顺序读取d:
/text.txt的文件里的内容,并显示在控制台上面,直到文件结束为止。
?
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
publicclassep8_2{
publicstaticvoidmain(String[]args){
FileInputStreamfis;
try{
fis=newFileInputStream("text.txt");
System.out.print("contentoftextis:
");
intb;
while((b=fis.read())!
=-1)//顺序读取文件text里的内容{
System.out.print((char)b);
}
fis.close();
}catch(FileNotFoundExceptione){
System.out.println(e);
}catch(IOExceptione){
System.out.println(e);
}
}
}
2、使用FileInputStream类和FileOutputStream类,编写一个程序,顺序读取d:
/text.txt的文件里的内容,并将内容拷贝到d:
/text.bak文件?
importjava.io.*;
publicclassTestFileOutputStream{
publicstaticvoidmain(String[]args){
intb=0;
FileInputStreamin=null;
FileOutputStreamout=null;
try{
in=newFileInputStream("d:
/text.txt");
out=newFileOutputStream("d:
/text.bak");
while((b=in.read())!
=-1){
out.write(b);
}
in.close();
out.close();
}catch(FileNotFoundExceptione2){
System.out.println("找不到文件");System.exit(-1);
}catch(IOExceptione1){
System.out.println("文件复制错误");System.exit(-1);
}
System.out.println("文件已经复制");
}
}
3、递归列出d:
/java目录下的所有子目录和文件,再显示到控制台
importjava.io.*;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 语言程序设计 复习 考试题 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)