一:简答题(5分)
什么是java序列化,如何实现java序列化?
答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,
implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
使用处理流的优势有哪些?如何识别所使用的流是处理流还是节点流
【答案】
【优势】对开发人员来说,使用处理流进行输入/输出操作更简单;使用处理流的执行效率更高。
【判别】
处理流的构造器的参数不是一个物理节点,而是已经存在的流。而节点流都是直接以物理IO及节点作为构造器参数的。
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请指出它们分别是哪些类
Java中按所操作的数据单元的不同,分为字节流和字符流。
字节流继承于InputStream和OutputStream类;
字符流继承于Reader和Writer。
按流的流向的不同,分为输入流和输出流。
按流的角色来分,可分为节点流和处理流。缓冲流、转换流、对象流和打印流等都属于处理流,使得输入/输出更简单,执行效率更高。
数组有没有length()方法?String有没有length()方法?File有没有length()方法?ArrayList有没有length()方法?
数组没有length()方法,但是有length属性。
String和File有length()方法。
ArrayList没有length()方法,有size()方法获取有效元素个数
5、sleep() 和 wait() 有什么区别?
答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
6、创建线程有哪两种方式(jdk5.0之前)?试写创建线程步骤。比较两种创建方式的不同,哪个更优。
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
1—继承Thread类
- 定义类继承Thread类。
- 覆盖Thread类中的run方法。
- 创建Thread子类对象,即创建了线程对象。
- 调用线程对象start方法:启动线程,调用run方法。
2—实现Runnable接口
1)定义类,实现Runnable接口。
2)覆盖Runnable接口中的run方法。
3)通过Thread类建立线程对象。
4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法中。
5)调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。
【区别】
继承Thread: 线程代码存放Thread子类run方法中。
实现Runnable:线程代码存在接口的子类的run方法。
【实现方法的好处】
1)避免了单继承的局限性
2)多个线程可以共享同一个接口子类的对象,非常适合多个相同线程来处理同一份资源
7、请说出你所知道的线程同步的方法
答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
8、线程的基本概念、线程的基本状态以及状态之间的关系
答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
Java中的线程有四种状态分别是:创建、就绪、运行、阻塞、结束
二、判断题(2分)
1.C 和 Java 都是多线程语言。( )
【答案】
1.难度:容易
答案:错误
知识点:C 是单线程语言。
2.如果线程死亡,它便不能运行。( )
2.难度:容易
答案:正确
知识点:线程死亡就意味着它不能运行
3.在 Java 中,高优先级的可运行线程会抢占低优先级线程。( )
3.难度:适中
答案:正确
知识点:线程优先级的使用。
4.程序开发者必须创建一个线程去管理内存的分配。( )
4.难度:适中
答案:错误
知识点:Java 提供了一个系统线程来管理内存的分配。
5.如果线程的 run 方法执行结束或抛出一个不能捕获的例外,线程便进入等待状态。( )
难度:适中
答案:错误
知识点:如果线程的 run 方法执行结束或抛出一个不能捕获的例外,线程便进入死亡状态。
6.一个线程可以调用 yield 方法使其他线程有机会运行。( )
难度:适中
答案:正确
知识点:yield 方法总是让高优先级的就绪线程先运行。
三:选择题(3)
1.计算机处理的数据最终分解为▁▁的组合。
A 0
B 数据包
C 字母
D 1
1.难度:容易答案:AD 知识点:计算机最终能处理的数据只能为 0 和 1。
2.计算机处理的最小数据单元称为▁▁。
A 位
B 字节
C 兆
D 文件
2.难度:容易答案:B 知识点:计算机处理的最小数据单元是字节。
3.字母、数字和特殊符号称为▁▁。
A 位
B 字节
C 字符
D 文件
3.难度:容易答案:C 知识点:字符的概念。
4.在FilterOutputStream类的构造方法中,下面哪个类是合法:
A File
B InputStream
C OutputStream
D FileOutputStream
难度:适中答案:C 知识点:在FilterOutputStream类中只有一种结构:public
FilterOutputStream(OutputStream)。
5.Java 语言中提供了一个▁▁线程,自动回收动态分配的内存。
A 异步
B 消费者
C 守护
D 垃圾收集
1.难度:容易
答案:D
知识点:垃圾线程的使用。
6.用▁▁方法可以改变线程的优先级。
A run
B setPrority
C yield
D sleep
难度:容易
答案:B
知识点:setPrority 方法的使用。
7 .线程通过▁▁方法可以休眠一段时间,然后恢复运行。
A run
B setPrority
C yield
D sleep
难度:容易
答案:D
知识点:sleep 方法的使用。
8.▁▁方法可以用来暂时停止当前线程的运行。
A stop( )
B sleep( )
C wait( )
D suspend()
难度:适中
答案:BCD
知识点:当调用 stop( )方法后,当前的线程不能重新开始运行
三:填空题
(5分)
下列程序将从file1.dat文件中读取全部数据,然后写到file2.dat文件中。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStreamInOut {
public static void main(String[] args) {
try {
File inFile = new File("_________");
File outFile = new File("_________");
FileInputStream fis = new FileInputStream(_________);
FileOutputStream fos = new FileOutputStream(_________);
int c;
while ((c = fis.read()) != -1) {
fos.write(c);
}
_____.close();
_____.close();
} catch (FileNotFoundException e) {
System.out.println("FileStreamsTest:" + e);
} catch (IOException e) {
System.out.println("FileStreamTest" + e);
}
}
}
public class Test {
public static void main(String[] args) {
MyThread m = new MyThread();
Thread t = new Thread(m);
t.start();
{1}
int j = m.i;
System.out.println(j);
}
}
class MyThread implements Runnable{
int i;
public void run(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i=100;
}
}
答案:t.join()
利用多线程设计一个程序,同时输出 50 以内的奇数和偶数,以及当前运行的线程名。(14分)
public class ThreadPrint extends Thread {
int k = 1;
public void run() {
int i = k;
while (i < 50) {
System.out.println(Thread.currentThread().getName() + "-----" + i);
i += 2;
}
System.out.println(Thread.currentThread().getName() + " end!");
}
public static void main(String[] args) {
ThreadPrint t1 = new ThreadPrint();
ThreadPrint t2 = new ThreadPrint();
t1.k = 1;
t2.k = 2;
t1.start();
t2.start();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)