多線程測試題

多線程
一、判斷題(T爲正確,F爲錯誤),每題1分
1.如果線程死亡,它便不能運行。(T)
2.在Java中,高優先級的可運行線程會搶佔低優先級線程。( F)
3.線程可以用yield方法使低優先級的線程運行。(F)
4…程序開發者必須創建一個線程去管理內存的分配。(F)
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.有三種原因可以導致線程不能運行,它們是ACD。
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時間片的輪轉以及線程的優先級(優先級高的搶佔到CPU執行權的概率就高,但不一定就能搶到)

4.如何在Java程序中實現多線程?
答:方法一(創建一個類並繼承自Thread類):
1、自己創建一個類繼承自Thread類
2、在繼承Thread類的類中重寫Run()方法;
3、在主線程中創建該類的實例;
4、啓動線程;
方法二:(創建一個類並實現Runnable接口):
1、自己創建一個類並實現Runnable接口;
2、在實現Runnable接口的類中重寫run()方法;
3、在主線程中創建該類的對象;
4、再創建Thread類對象,將實現了Runnable接口的類的對象作爲參數進行傳遞;
5、啓動線程;
方法三(實現Callable接口):
1、自己創建一個類並實現Callable接口;
2、創建線程池對象利用工廠類;
3、提交Callable任務;
4、結束線程池;

5.試簡述Thread類的子類或實現Runnable接口兩種方法的異同?
答:相同點:都要重寫run()方法;
不同點:一個繼承自Thread類;另一個採用實現Runnable接口的方式;

6.說明緩衝流的優點和原理
答:首先緩衝流分爲字符緩衝流(BufferedInputStream和BufferedOutputStream)和字符緩衝流(BufferedReader和BufferedWriter);
優點:緩衝流能夠高效的進行讀寫操作;
原理:先將數據存入緩衝區,然後再一起寫入或者一起讀出;

8:在Java中wait()和sleep()方法的不同?
答:不同點:wait() 線程等待,一旦調用就會立即釋放鎖;
Sleep() 線程睡眠,不會釋放鎖;
相同點:都是阻塞式,並且一旦打破兩個狀態都會拋出中斷異常(InterruptedException)

9:Java中Runnable和Callable有什麼不同?
答:1、Runnablle運行線程採用run()方法而Callable採用call()方法;
2、Runnable採用start()方法啓動程序而Callable採用 Future submit(Callable task)提交任務從而啓動線程;
3、call()方法有返回值而run()方法沒有返回值;
4、call()方法會拋出異常而run()方法不會拋出異常;

四、程序設計題
1.編寫一個應用程序,在線程同步的情況下來實現“生產者―消費者”問題。
學生類:

package _14.homework;
public class Student {
     String name;
     int age;
     String sex;
}

生產者線程:

package _14.homework;
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 = "張三";
                    s.age = 24;
                    s.sex = "男";
                } else {
                    s.name = "翠花";
                    s.age = 18;
                    s.sex = "女";
                }
            }
            x++;
        }
    }
}

消費者線程:

package _14.homework;
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);
            }
        }
    }
}

主線程:

package _14.homework;
public class ThreadDemo1 {
    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
老師類:

package _14.homework;
import java.io.Serializable;
public class TeacherDemo implements Serializable{
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String sex;
    public TeacherDemo(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    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;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "TeacherDemo [name=" + name + ", age=" + age + ", sex=" + sex
                + "]";
    }   
}

學生類:

package _14.homework;
import java.io.Serializable;
public class StudentDemo implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String sex;
    public StudentDemo(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    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;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "StudentDemo [name=" + name + ", age=" + age + ", sex=" + sex
                + "]";
    }
}

測試類:

package _14.homework;

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("小明",10,"男"));
        oos.writeObject(new StudentDemo("小蘭",12,"女"));
        oos.writeObject(new StudentDemo("小紅",12,"女"));
        oos.writeObject(new TeacherDemo("張三",30,"男"));
        oos.writeObject(new TeacherDemo("李四",26,"男"));
        oos.writeObject(new TeacherDemo("玫瑰",28,"女"));

        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”轉換爲字節數組,並將字節數組再轉換回字符串!

package _14.homework;

public class Demo2 {
    public static void main(String[] args){
        String str="西部開源技術中心xbkyjszx";
        byte[] by=str.getBytes();
        System.out.println(by);
        System.out.println("----------------------------------");
        String str2=new String(by);
        System.out.println(str2);
    }
}

5:用Java編程一個會導致死鎖的程序,你將怎麼解決?請你設計

6:遞歸實現輸入任意目錄,列出文件以及文件夾

package _14.homework;

import java.io.File;

public class DiGui {
    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());
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章