[2017.12.07]作业15

一、判断题(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.创建一个类并继承自Thread2.创建一个类并实现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());
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值