多線程
一、判斷題(T爲正確,F爲錯誤),每題1分
1.如果線程死亡,它便不能運行。(T)
2.在Java中,高優先級的可運行線程會搶佔低優先級線程。(T)
3.線程可以用yield方法使低優先級的線程運行。(F)
4...程序開發者必須創建一個線程去管理內存的分配。(F)
5.一個線程在調用它的start方法,之前,該線程將一直處於出生期。(
T)
6.當調用一個正在進行線程的stop( )方法時,該線程便會進入休眠狀態。(F)
7.一個線程可以調用yield方法使其他線程有機會運行。(T)
8. 多線程沒有安全問題(F)
9. 多線程安全問題的解決方案可以使用Lock提供的具體的鎖對象操作(T)
10. Stop()方法是終止當前線程的一種狀態(T)
二、選擇題(不定項選擇題),每題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( )負責重新開始▁▁線程的執行。
A.被stop( )方法停止
B.被sleep( )方法停止
C.被wait( )方法停止
D.被suspend( )方法停止
9.▁▁D方法可以用來暫時停止當前線程的運行。
A.stop( )
B.sleep( )
C.wait( )
D.suspend( )
10. 請問下列哪些類是定義在java.io包中的抽象類(ABCEF)
A. InputStream
B. OutputStream
C. PrintStream
D. Reader
E. FileInputStream
F. FileWriter
三、簡述題,每題5分
1.簡述程序、進程和線程之間的關係?什麼是多線程程序?
線程是依賴於進程存在的
進程:系統調用分配資源的一種方式(如打開一個應用)
一般存在多個進程,提高CPU的使用率
線程相當於進程中的任務,線程的執行具有隨機性;在分別搶佔CPU的執行權,提高程序的效率;
3.什麼是線程調度?Java的線程調度採用什麼策略?
在單個Cpu以某種順序運行多個多個線程,是一種優先級的搶先式調度
4.如何在Java程序中實現多線程?
1:通過Thread類繼承Thread
2:實現Runable接口
3:線程池利用Executors工廠類來進行ExecutorService對象的創建
5. 試簡述Thread類的子類或實現Runnable接口兩種方法的異同?
實現Runable接口更符合java設計思想(數據分離原則)
6. 說明緩衝流的優點和原理
緩衝流的特點是速度快。如果只是節點流進行數據的傳輸的話,需要一個字節一個字節的傳輸。而緩衝流和節點流同時進行的話速度就快的很多,那是因爲節點流每傳輸n個字節就會打上標記,再去傳輸後面的n個字節,在節點流傳輸後面的n個字節時,緩衝流傳輸第一次傳輸的n個字節,所以速度明顯要快。
8:在Java中wait()和sleep()方法的不同?
Wait()是需要喚醒的,sleep在一段時間後自動喚醒
9:Java中Runnable和Callable有什麼不同?
它們的主要區別是Callable的 call() 方法可以返回值和拋出異常,而Runnable的run()方法沒有這些功能。Callable可以返回裝載有計算結果的Future對象
.
四、程序設計題
1.編寫一個應用程序,在線程同步的情況下來實現“生產者―消費者”問題。
2.修改上題,由於各個線程是異步運行的,因此無法預計其相對速度,爲了使生產者能夠不斷地生產,可以使用循環緩衝區,保證有足夠多的內存區保存更多的產品。(生產者——倉庫——消費者)
3 :
1)將若干個Student對象;若干個Teacher對象,寫出到d:/0404/a.txt中,
2)將該文件中所有的Student對象反序列化回來,裝入List,所有的Teacher對象反序列化回來裝入另一個List
package Homework;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String sex; private int age;
public String getName() {
return name;
}
public void setName(String name) { t
his.name = name;
}
public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public int getAge() {
return age;
} public void setAge(int age) { t
his.age = age;
}
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
public Person(String name, String sex, int age) { super();
this.name = name;
this.sex = sex;
this.age = age;
} public Person() {
super();
} }
學生類
package Homework;
public class Student extends Person {
public Student(String name,String sex,int age){
super(name, sex, age);
}
public Student(){}
public String toString() {
return "Student [getName()=" + getName() + ", getSex()=" + getSex() + ", getAge()=" + getAge() + "]";
}
}
老師類
package Homework;
public class Teacher extends Person {
public Teacher(String name,String sex,int age){
super(name, sex, age);
}
public Teacher(){}
public String toString() {
return "Teacher [getName()=" + getName() + ", getSex()=" + getSex() + ", getAge()=" + getAge() + "]";
}
}
測試類
package 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 Test1and2 {
public static void main(String[] args) {
File file=new File("Instance"); file.mkdirs();
File file2=new File(file,"a.txt");
ObjectOutputStream oos=null;
ObjectInputStream ois=null;
try {
file2.createNewFile();
oos=new ObjectOutputStream(new FileOutputStream(file2));
oos.writeObject(new Student("李四","男",20));
oos.writeObject(new Student("李四2","男",45));
oos.writeObject(new Student("李四3","男",38));
oos.writeObject(new Teacher("張三","男",13));
oos.writeObject(new Teacher("張三","男",50));
oos.writeObject(new Teacher("張三","男",34));
oos.flush();
List ois=new ObjectInputStream(new FileInputStream(file2));
ArrayList<Student> list=new ArrayList<>();
ArrayList<Teacher> list2=new ArrayList<>();
for(int i=0;i<6;i++){
if(i<=2){
Student student=(Student)ois.readObject();
list.add(student);
}else {
Teacher teacher=(Teacher)ois.readObject();
list2.add(teacher);
}
}
for (Student student : list) {
System.out.println(student);
}
for (Teacher teacher : list2) {
System.out.println(teacher);
}
} catch (IOException e) {
catch block e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally { if(ois!=null){
try { ois.close();
} catch (IOException e) {
e.printStackTrace();
}
} if(oos!=null){
try { oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4:實現字符串和字節數組之間的相互轉換,比如:將字符串”西部開源技術中心xbkyjszx”轉換爲字節數組,並將字節數組再轉換回字符串!
public class Test
{
public static void main(String[] args) throws IOException
{
String contents = " 西部開源技術中心";
System.out.println(contents);
//String---byte []
byte[] buf = contents.getBytes();
//byte[]----String
String contents2 = new String(buf, 0, buf.length);
System.out.println(contents2);
}
5:用Java編程一個會導致死鎖的程序,你將怎麼解決?請你設計
public class DieLock extends Thread {
private boolean flag ;
public DieLock(boolean flag){
this.flag = flag ;
}
public void run() {
if(flag){
synchronized(MyLock.objA){
System.out.println("if objA");
synchronized (MyLock.objB) {
System.out.println("if objB");
}
}
}else {
//dl2
synchronized (MyLock.objB) {
System.out.println("else objB");
synchronized(MyLock.objA){
System.out.println("else objA");
}
}
}
}
}
public class DieLockDemo {
public static void main(String[] args) {
DieLock dl1 = new DieLock(true) ;
DieLock dl2 = new DieLock(false);
dl1.start() ;
dl2.start() ;
}
}
public class MyLock {
public static final Object objA = new Object() ;
public static final Object objB = new Object() ;
}
6:遞歸實現輸入任意目錄,列出文件以及文件夾
package work1;
import java.io;
import java.util.Scanner;
public class test{
public static void main(String[] args) {
System.out.print("please input content:");
Scanner con=new Scanner (System.in);
String c= con.nextLine();
con.close();
listtest(c);
}
private static void listtest(String path) {
// TODO
File file = new File(path);
File[] files = file.listFiles();
for(File f : files){
if(f.isDirectory()){
System.out.println(f);
listtest(f.getPath());
}else{
System.out.println(f);
}
}
}
}