一、判断题(T为正确,F为错误),每题1分
1.如果线程死亡,它便不能运行。(T)
2.在Java中,高优先级的可运行线程会抢占低优先级线程。( F)
3.线程可以用yield方法使低优先级的线程运行。(F)
4…程序开发者必须创建一个线程去管理内存的分配。(T)
5.一个线程在调用它的start方法,之前,该线程将一直处于出生期。( T)
6.当调用一个正在进行线程的stop( )方法时,该线程便会进入休眠状态。(F)
7.一个线程可以调用yield方法使其他线程有机会运行。(T)
8.多线程没有安全问题(F)
9.多线程安全问题的解决方案可以使用Lock提供的具体的锁对象操作(T)
10.Stop()方法是终止当前线程的一种状态(F)
二、选择题(不定项选择题),每题2分
1.Java语言中提供了一个 D 线程,自动回收动态分配的内存。
A.异步
B.消费者
C.守护
D.垃圾收集
2.Java语言避免了大多数的 C 错误。
A.数组下标越界
B.算术溢出
C.内存泄露
D.非法的方法参数
3.有三种原因可以导致线程不能运行,它们是 AC 。
A.等待
B.阻塞
C.休眠
D.挂起及由于I/O操作而阻塞
4.当 A 方法终止时,能使线程进入死亡状态。
A.run
B.setPrority//更改线程优先级
C.yield//暂停当前线程的执行 执行其他线程
D.sleep//线程休眠
5.用 B 方法可以改变线程的优先级。
A.run
B.setPrority
C.yield
D.sleep
6.线程通过 C 方法可以使具有相同优先级线程获得处理器。
A.run
B.setPrority
C.yield
D.sleep
7.线程通过 D 方法可以休眠一段时间,然后恢复运行。
A.run
B.setPrority
C.yield
D.sleep
8.方法resume( )负责重新开始 D 线程的执行。
A.被stop( )方法停止
B.被sleep( )方法停止
C.被wait( )方法停止
D.被suspend( )方法停止
9. BCD 方法可以用来暂时停止当前线程的运行。
A.stop( )
B.sleep( )
C.wait( )
D.suspend( )
10.请问下列哪些类是定义在java.io包中的抽象类 ABD
A.InputStream
B.OutputStream
C.PrintStream
D.Reader
E.FileInputStream
F.FileWriter
三、简述题,每题5分
1.简述程序、进程和线程之间的关系?什么是多线程程序?
线程是依赖于进程存在,一个线程相当于进程中的某个任务;
如果程序的执行路径有多条,那么称为多线程程序
3.什么是线程调度?Java的线程调度采用什么策略?
线程调度是线程对于CPU执行权的抢占
线程调度采用CPU时间片的轮转以及线程的优先级
4.如何在Java程序中实现多线程?
1.创建一个类并继承自Thread类
2.创建一个类并实现Runnable接口
3.实现Callable接口
5.试简述Thread类的子类或实现Runnable接口两种方法的异同?
相同点:都要重写run()方法;
不同点:一个继承自Thread类;另一个采用实现Runnable接口的方式
6.说明缓冲流的优点和原理
优点:缓冲流能够高效的进行读写操作
原理:先将数据存入缓冲区,然后再一起写入或者一起读出
8:在Java中wait()和sleep()方法的不同?
wait() 线程等待,一旦调用就会立即释放锁
Sleep() 线程睡眠,不会释放锁
9:Java中Runnable和Callable有什么不同?
1.Runnablle运行线程采用run()方法而Callable采用call()方法
2.call()方法有返回值而run()方法没有返回值
3.call()方法会抛出异常而run()方法不会抛出异常
四、程序设计题
1.编写一个应用程序,在线程同步的情况下来实现“生产者―消费者”问题。
学生类:
public class Student {
String name;
int age;
String sex;
}
生产者:
public class SetThreadDemo implements Runnable {
private Student s;
private int x = 0;
public SetThreadDemo(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
synchronized (s) {
if (x % 2 == 0) {
s.name = "lily";
s.age = 20;
} else {
s.name = "jackson";
s.age = 17;
}
}
x++;
}
}
}
消费者:
public class GetThreadDemo implements Runnable {
private Student s;
public GetThreadDemo(Student s){
this.s=s;
}
@Override
public void run() {
while(true){
synchronized(s){
System.out.println(s.name+"---"+s.age+"---"+s.sex);
}
}
}
}
public class Thread1 {
public static void main(String[] args) {
//创建学生类对象
Student s = new Student();
//创建资源对象
SetThreadDemo std = new SetThreadDemo(s);
GetThreadDemo gtd = new GetThreadDemo(s);
//创建线程类对象
Thread t1 = new Thread(std);
Thread t2 = new Thread(gtd);
//启动线程
t1.start();
t2.start();
}
}
2.修改上题,由于各个线程是异步运行的,因此无法预计其相对速度,为了使生产者能够不断地生产,可以使用循环缓冲区,保证有足够多的内存区保存更多的产品。(生产者——仓库——消费者)
这里写代码片
3 :
1)将若干个Student对象;若干个Teacher对象,写出到d:/0404/a.txt中,
2)将该文件中所有的Student对象反序列化回来,装入List,所有的Teacher对象反序列化回来装入另一个List
老师类:
import java.io.Serializable;
public class TeacherDemo implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int age;
public TeacherDemo(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@Override
public String toString() {
return "TeacherDemo [name=" + name + ", age=" + age + "+ "]";
}
}
学生类:
import java.io.Serializable;
public class StudentDemo implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public StudentDemo(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "StudentDemo [name=" + name + ", age=" + age + "]";
}
}
测试类:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) throws IOException, ClassNotFoundException{
File file=new File("D:\\0404");
file.mkdir();
File file1=new File("D:\\0404\\a.txt");
file1.createNewFile();
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file1));
oos.writeObject(new StudentDemo("lily",20));
oos.writeObject(new StudentDemo("jackson",17));
oos.writeObject(new StudentDemo("jay",36));
oos.flush();
//反序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file1));
ArrayList<StudentDemo> list=new ArrayList<StudentDemo>();
ArrayList<TeacherDemo> list1=new ArrayList<TeacherDemo>();
for(int i = 0;i < 6; i++){
if(i < 3){
StudentDemo s=(StudentDemo)ois.readObject();
list.add(s);
}else{
TeacherDemo t=(TeacherDemo)ois.readObject();
list1.add(t);
}
}
for(StudentDemo student:list){
System.out.println(student);
}
for(TeacherDemo teacher:list1){
System.out.println(teacher);
}
}
}
4:实现字符串和字节数组之间的相互转换,比如:将字符串”西部开源技术中心xbkyjszx”转换为字节数组,并将字节数组再转换回字符串!
public class Homework42 {
public static void main(String[] args){
String str="西部开源技术中心xbkyjszx";
byte[] by=str.getBytes();
System.out.println(by);
String str2=new String(by);
System.out.println(str2);
}
}
5:用Java编程一个会导致死锁的程序,你将怎么解决?请你设计
这里写代码片
6:递归实现输入任意目录,列出文件以及文件夹
import java.io.File;
public class Homework6 {
public static void main(String[] args) {
File file = new File("D:\\11.19");
searchFile(file);
}
private static void searchFile(File f) {
File[] file1=f.listFiles();
if(file1!=null){
for(File fil:file1){
if(fil.isDirectory()){
System.out.println(fil.getName()+"--"+fil.getPath());
searchFile(fil);
}
System.out.println(fil.getName()+"---"+fil.getPath());
}
}
}
}