Java面向对象程序设计(第二版)第八、九章课后习题

第八章

3.String类型有什么特点?
String的特点是一旦复制,便不能更改其指向的字符对象。如果更改,则会指向一个新的字符对象。String对象是不可变的。
4.String什么时候进行值得比较,什么时候进行引用比较?
String类对equals方法进行了覆盖,比较两个字符串对象的内容是否相同,equals是值比较。
stringA.equals(stringB);进行值比较
stringA==stringB;进行引用比较
5.String与StringBuffer的区别是什么?如何相互转化?
StringBuffer是一个具有对象引用传递特点的字符串对象。
//数据类型由String转为StringBuffer
String s = “hello”;
StringBuffer sb = new StringBuffer(s); //调用的构造函数
//String也有相反的构造函数
String a = new String(sb);
//还可以用StringBuffer的一个方法
String str = sb.toString() ;

第九章

1.线程和进程的联系和区别是什么?
一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间,一组系统资源,每一个进程的内部数据和状态都是完全独立的。java程序执行中的单个顺序的流控制称为线程,多线程则指一个进程中可以同时运行多个不同的线程,执行不同的任务。
区别:同类的多个线程共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。
2.什么是前台进程,什么是后台进程?
应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
3.创建线程有几种方法?他们之间的区别是什么?
第一种方式:使用Runnable接口创建线程
1.可以实现多个线程资源共享
2.线程体run()方法所在的类可以从其它类中继承一些有用的属性和方法
第二种方式:直接继承Thread类创建对象
1.Thread子类无法再从其它类继承(java语言单继承)。
2.编写简单,run()方法的当前对象就是线程对象,可直接操作。
4.线程的生命周期有哪些状态?哪些方法可以改变这些状态?
1、创建状态:线程对象已经创建,还没有在其上调用start()方法。
2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
4、阻塞状态:这是线程有资格运行时它所处的状态。如执行了join/sleep/wait方法,会让出CPU,只有当引起阻塞的原因消除时,线程才能转入就绪状态。
5、死亡态:当线程的run()方法完成时就认为它死去。或者抛出一个未捕获到的Exception或Error。
5.什么是线程安全?为什么会产生线程安全问题?如何解决线程安全问题?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
原因是由于不同线程获取到资源时进行运算,但未来得及写入时,线程改变,则另外线程读入的资源就是错误,导致所有线程写入读入不同步。
解决办法:
使用监视器,使用关键字synchronized监视同步代码块,当一个线程获得监视权限时,别的线程就无法获得,保证每时每刻只有一个线程调用某一方法。
6.什么是线程的同步通信?同步通信又是如何实现的?
线程同步通信是希望实现两个或多个线程之间的某种制约关系
实现:首先是用监视器synchronized来保证每次只有一个线程调用方法,其次引入一个boolean型标志来判断该线程是否执行或wait,两个线程时使用notify(),多个线程时用notifyAll()来让出监视器并唤醒其他线程。这样就实现了线程之间的关系。
7.什么是死锁?
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。
8.如何让某个对象的A方法内的一个代码块和另一个方法B实现同步?

class Account                              
{
    volatile private int value;
    void put(int i)                       
	{
    	synchronized(this) {
		value = value + i; 
		System.out.println("存入"+i+" 账上金额为:"+value);
    	}
	}
    synchronized int get(int i)                         
    {   
		if (value>i)
				value = value - i;             
			else                               
			{   i = value;
				value = 0;                     
			}
		System.out.println("取走"+i+" 账上金额为:"+value);
      return i;                      
    }    
}
class  Save implements Runnable            
{
	int a=2000;
    private Account a1;     
    public Save(Account a1)
    {
        this.a1 = a1;
    }
    public void run()
    {
        while(a-->0){
			a1.put(100);			
	    }
    }
}
class Fetch implements Runnable            
{
	int a=2000;
    private Account a1;
    public Fetch(Account a1)
    {this.a1 = a1 ;}
    public void run()
    {       
		while(a-->0){		
			a1.get(100);			
		}		
    }
}
public class Test{
	public static void main(String[] args){
       Account a1 = new Account();
       new Thread(new Save(a1)).start(); 
       new Thread(new Fetch(a1)).start();
	}
}

9.设计一个程序产生两个线程A与B,B线程执行10秒钟后,被A线程中止。

class Account                              
{
	int b=0;
	void change(int _a) {b=_a;}
	int getb() {return b;}
    volatile private int value;
    synchronized void put(int i)                       
	{
		value = value + i; 
		System.out.println("存入"+i+", 账上金额为:"+value);
	}
}
class  Save implements Runnable            
{
	//int a=2000;
    private Account a1;     
    public Save(Account a1)
    {
        this.a1 = a1;
    }
    public void run()
    {
    	while(a1.getb()==0) {
        	try {
				Thread.sleep(900);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			a1.put(1);			
	    }
    	System.out.println("10秒已到,停止存钱。stop!");
    }
}
class Fetch implements Runnable            
{
	//int a=20;
    private Account a1;
    public Fetch(Account a1)
    {this.a1 = a1 ;}
    public void run()
    {    
    	if(a1.getb()==0) {
    	try {
		Thread.sleep(9000);
    	} catch (InterruptedException e) {}
    	}
    	a1.change(1);	
    }
}
public class Test{
	public static void main(String[] args){
       Account a1 = new Account();
       new Thread(new Save(a1)).start(); 
       new Thread(new Fetch(a1)).start();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值