您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java语言程序设计(郑莉)第八章课后习题答案
Java语言程序设计第八章课后习题答案1.进程和线程有何区别,Java是如何实现多线程的。答:区别:一个程序至少有一个进程,一个进程至少有一个线程;线程的划分尺度小于进程;进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。Java程序一般是继承Thread类或者实现Runnable接口,从而实现多线程。2.简述线程的生命周期,重点注意线程阻塞的几种情况,以及如何重回就绪状态。答:线程的声明周期:新建-就绪-(阻塞)-运行--死亡线程阻塞的情况:休眠、进入对象wait池等待、进入对象lock池等待;休眠时间到回到就绪状态;在wait池中获得notify()进入lock池,然后获得锁棋标进入就绪状态。3.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000毫秒以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。(注:两个类,相同一个测试类)//Runnable接口实现的线程runable类publicclassrunnableimplementsRunnable{privateStringcity;publicrunnable(){}publicrunnable(Stringcity){this.city=city;}publicvoidrun(){for(inti=0;i10;i++){System.out.println(city);try{//休眠1000毫秒。Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}}//Thread类实现的线程thread类publicclassrunnableextendsThread{privateStringcity;publicrunnable(){}publicrunnable(Stringcity){this.city=city;}publicvoidrun(){for(inti=0;i10;i++){System.out.println(city);try{//休眠1000毫秒。Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}}//test8_3publicclasstest8_3{publicstaticvoidmain(String[]args){//将创建一个线程对象,这个对象接受一个实现了Runnable接口。实际上这里也就是使用run()方法runnabler1=newrunnable(广州);runnabler2=newrunnable(乌鲁木齐);Threadt1=newThread(r1);Threadt2=newThread(r2);//启动线程t1.start();t2.start();}}运行结果分别为:4.编写一个多线程程序实现如下功能:线程A和线程B分别在屏幕上显示信息“…start”后,调用wait等待;线程C开始后调用sleep休眠一段时间,然后调用notifyall,使线程A和线程B继续运行。线程A和线程B恢复运行后输出信息“…end”后结束,线程C在判断线程B和线程A结束后自己结束运行。//test8_4publicclasstest8_4{ThreadA=newThread(A){publicvoidrun(){Wait(A);}};ThreadB=newThread(B){publicvoidrun(){Wait(B);}};ThreadC=newThread(C){publicvoidrun(){while(true){if(!A.isAlive()&&!B.isAlive())return;try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}notifyall();}}};publicsynchronizedvoidWait(Stringname){System.out.println(name+..start);try{wait();}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(name+..end);}publicsynchronizedvoidnotifyall(){notifyAll();}publicstaticvoidmain(Stringargs[]){test8_4test=newtest8_4();//A、B两线程一起输入start和输出end,不过中间有C让线程休眠2秒,没法全部一次性输出,//之后再唤醒,让AB继续输出下半部分endtest.A.start();test.B.start();test.C.start();}}运行结果:5.实现一个数据单元,包括学号和姓名两部分。编写两个线程,一个线程往数据单元中写,另一个线程往外读。要求没写一次就往外读一次。//Data类importjava.util.Scanner;publicclassData{StringstudentId;Stringname;booleanavailable=false;//判断是读是写Scannerin=newScanner(System.in);//定义一个输入对象publicsynchronizedvoidread(){if(available)try{wait();}catch(Exceptione){}System.out.printf(请输入学号:);try{studentId=in.next();}catch(Exceptione){System.out.println(输入学号出错!);}System.out.printf(请输入姓名:);try{name=in.next();}catch(Exceptione){System.out.println(输入姓名出错!);}System.out.println();available=true;notify();}publicsynchronizedvoidwrite(){if(!available)try{wait();}catch(Exceptione){}System.out.println(输出学生学号:+studentId+姓名:+name+\n);available=false;notify();}}//Read类publicclassReadextendsThread{Datad1=null;publicRead(Datad){this.d1=d;}publicvoidrun(){while(true){d1.read();}}}//Write类classWriteextendsThread{Datad2=null;publicWrite(Datad){this.d2=d;}publicvoidrun(){while(true){d2.write();}}}//test8_5类publicclasstest8_5{publicstaticvoidmain(String[]args){Datadata=newData();newRead(data).start();newWrite(data).start();}}运行结果:6.创建两个不同优先级的线程,都从1数到10000,看看哪个数得快。(注:线程的优先级别越高低与执行速度没有绝对关系!)//Count类publicclassCountextendsThread{intwhich;intn=10000;publicCount(intwhich){this.which=which;}publicvoidrun(){for(inti=1;i=n;i++){if(i==n){System.out.println(which+号进程+结束!);}}}}//test8_6publicclasstest8_6{publicstaticvoidmain(String[]args){Countcount1=newCount(1);Countcount2=newCount(2);Threadt1=newThread(count1);Threadt2=newThread(count2);t1.setPriority(2);//1号进程优先级是2t2.setPriority(8);//2号进程优先级是8t1.start();t2.start();}}运行结果:都有可能。7.编写一个Java程序,以说明较高优先级的线程通过调用sleep方法,使较低优先级的线程获得运行的机会。(这里可以借鉴课本例8—13)//TestThread类publicclassTestThreadextendsThread{privateinttick=1;privateintnum;publicTestThread(inti){this.num=i;}publicvoidrun(){while(tick400000){tick++;if((tick%50000)==0){System.out.println(Thread#+num+,tick=+tick);yield();try{sleep(1);}catch(Exceptione){}}}}}//test8_7publicclasstest8_7{publicstaticvoidmain(String[]args){TestThread[]runners=newTestThread[2];for(inti=0;i2;i++){runners[i]=newTestThread(i);}runners[0].setPriority(2);runners[1].setPriority(5);for(inti=0;i2;i++){runners[i].start();}}}运行结果:8.主线程控制新线程的生命,当主线程运行一段时间后,控制新线程死亡,主线程继续运行一段时间后结束。(注:main函数就是主线程,程序里其他的Thread都属于子线程。可以参考课本的例8—1)//SonThread类publicclassSonThreadextendsThread{privateintnum;publicSonThread(intnum){this.num=num;}publicvoidrun(){inti=num;intresult=1;System.out.println(newthreadstart.);/*while(i0){result=result*i;i--;}*/System.out.println(thenewthreadof+num+is+result);System.out.println(newthreadends);}}//test8_8publicclasstest8_8{publicstaticvoidmain(String[]args){System.out.println(maintreadstart.);SonThreadnewThread=newSonThread(10);newThread.start();//;浪费时间的循环inti=1;while(i=100000){i++;}newThread.stop();//结束新进程System.out.println(mainthreadends);}}运行结果:(这个结果很难把握,通常都会出现2那样的结果,知道原理就好。)29.用两个线程模拟存、取货物。一个线程往一对象里放货物(包括品名、价格),另外一个线程取货物。分别模拟“放一个、取一个”和“放若干个、取若干个”两种情况。//Good货物类pu
本文标题:Java语言程序设计(郑莉)第八章课后习题答案
链接地址:https://www.777doc.com/doc-2879053 .html