12.2日作业

多线程

一、判断题(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( )负责重新开始▁D▁线程的执行。
A.被stop( )方法停止
B.被sleep( )方法停止
C.被wait( )方法停止
D.被suspend( )方法停止
9.▁BCD▁方法可以用来暂时停止当前线程的运行。
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.简述程序、进程和线程之间的关系?什么是多线程程序?

    程序是一段静态代码块,它是应用软件执行的蓝本.进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程。这个偶成也是进程本身从产生、发展、到消亡的过程。线程是比进程更小的单位。一个进程在其执行过程中,可以产生多个线程,形成多个执行流。每个执行流即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。多线程程序是指一个程序中包含多个执行流。
3.什么是线程调度?Java的线程调度采用什么策略?

    在单个CPU上以某种顺序运行多个线程,称为线程的调度。Java的线程调度策略是一种优先级的抢先式调度。Java基于线程的优先级选择高优先级的线程进行运行。该线程将持续运行,知道它终止,或其他高优先级线程称为可运行的。
4.如何在Java程序中实现多线程?

    过Thread类的构造方法;

    过实现Runnable接口创建线程;

    过集成Thread类创建线程。

 

5.试简述Thread类的子类或实现Runnable接口两种方法的异同?     

    才有继承Thread类方法使程序代码简单,并可以在run()方法中直接调用线程的其他方法。而实现Runnable接口更符合面向对象设计的思想,thread类是虚拟CPU封装,所以Thread的子类应该是过于CPU行为的类。但在继承Thread类构造线程的方法中,Thread类的子类大都是与CPU不相关的类。而实现Runnable接口的方法,将不影响Java类的体系,所以更加符合面向对象的设计思想。同时,实现了Runnable接口的类可以用extends继承其他类。

6.说明缓冲流的优点和原理


8:在Java中wait()和sleep()方法的不同?

    对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

获取对象锁进入运行状态。

 

9:Java中Runnable和Callable有什么不同?

                1.Callable 使用 call() 方法, Runnable 使用 run() 方法 
                2.call()可以返回值, 而 run()方法不能返回。 
                3.call()可以抛出受检查的异常, 而run()不能抛出受检查的异常。

四、程序设计题
1.编写一个应用程序,在线程同步的情况下来实现“生产者―消费者”问题。

  

2.修改上题,由于各个线程是异步运行的,因此无法预计其相对速度,为了使生产者能够不断地生产,可以使用循环缓冲区,保证有足够多的内存区保存更多的产品。(生产者——仓库——消费者)

package work2;

public class Test1 {

	public static void main(String[] args) throws Exception {
		Book b = new Book();
		Thread.currentThread().setPriority(20);
		ThreadAdd ta = new ThreadAdd(b);
		ThreadSub ts = new ThreadSub(b);
		ta.start();
		ts.start();
		Thread.sleep(100);
		System.out.println("当前还剩:"+b.number+"本"+b.name);
		System.exit(0);
	}
}
class Book{
	String name;
	int number;
	public Book(String name,int number){
		this.name = name;
		this.number = number;
	}
}


package work2;

import java.awt.print.Book;

public class ThreadAdd extends Thread{

	Book b;
	public ThreadAdd(Book b) {
		
		this.b = b;
	}
	public void run(){
		while(true){
			synchronized(b){
				if(b.number>=200){
					try {
						b.wait();
					} catch (Exception e) {
						
					}
				}
				b.notify();
				b.number++;
			}
			System.out.println("仓库中"+b.name+"增加"+b.number+"本");
		}
	}

}

package work2;

import java.awt.print.Book;

public class ThreadSub extends Thread{
	Book b;

	public ThreadSub(Book b) {
		this.b = b;
	}
	public void run(){
		while(true){
			synchronized(b){
				if(b.number>=200){
					try {
						b.wait();
					} catch (Exception e) {
						
					}
				}
				b.notify();
				b.number--;
			}
			System.out.println("仓库中"+b.name+"减少"+b.number+"本");
		}
	}

}

3 :

1)将若干个Student对象;若干个Teacher对象,写出到d:/0404/a.txt中,

  2)将该文件中所有的Student对象反序列化回来,装入List,所有的Teacher对象反序列化回来装入另一个List

 

package work2;

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 Test3 {

	public static void main(String[] args) {
		File file = new File("Instance");
		file.mkdirs();
		//创建a.txt文件
		File file2 = new File(file,"a.txt");
		ObjectInputStream ois = null;
		ObjectOutputStream oos = null;
		
		try {
			file2.createNewFile();
			oos = new ObjectOutputStream(new FileOutputStream(file2));
			oos.writeObject(new Student("齐旋", "男", 20));
			oos.writeObject(new Student("杨晓洲", "男", 21));
			oos.writeObject(new Student("邓聪", "男", 23));
			oos.writeObject(new Teacher("三哥", "男", 19));
			oos.writeObject(new Teacher("启龙", "男", 24));
			oos.writeObject(new Teacher("彭总", "男", 21));
			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 (Exception e) {
			// TODO: handle exception
		}finally{
			if(ois!=null){
				try {
					ois.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}
}

package work2;

public class Student extends Person{

	public Student(String name, String sex, int age) {
		// TODO Auto-generated constructor stub
		super(name,sex,age);
	}
	public Student(){
		
	}
	@Override
	public String toString() {
		return "Student [getName()"+getName()+",getSex()="+getSex()+"getAge()="+getAge()+"]";
	}
	

}
package work2;

public class Teacher extends Person{

	public Teacher(String name, String sex, int age) {
		// TODO Auto-generated constructor stub
		super(name,sex,age);
	}
	public Teacher(){
		
	}
	@Override
	public String toString() {
		return "Student [getName()"+getName()+",getSex()="+getSex()+"getAge()="+getAge()+"]";
	}
}

package work2;

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) {
		this.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) {
		this.age = age;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	@Override
	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();
		// TODO Auto-generated constructor stub
	}
	

}

4:实现字符串和字节数组之间的相互转换,比如:将字符串”西部开源技术中心xbkyjszx”转换为字节数组,并将字节数组再转换回字符串!

package work4;

public class Test4 {

	public static void main(String[] args) {
		String c = "英雄不朽";
		
		byte [] b = c.getBytes();
		System.out.println(c);
		String c2 = new String(b,0,b.length);
		System.out.println(c2);
	}
}


5:用Java编程一个会导致死锁的程序,你将怎么解决?请你设计

 

6:递归实现输入任意目录,列出文件以及文件夹



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值