还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第11章课后习题参考答案.解释下列名词术语进程、线程、状态、阻塞、优先级、同步、死锁、守护、线程安全进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础线程线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位状态状态用来表示线程所处的情况线程状态有“新建”、“可运行”、“运行”、“阻塞”、“死亡”等阻塞阻塞状态是指线程因为某种原因放弃CPU使用权,暂时停止运行直到满足某个触发条件又使线程进入就绪状态,才有机会转到运行状态优先级在操作系统中,线程可以划分优先级,线程优先级越高,获得CPU时间片的概率就越大,但线程优先级的高低与线程的执行顺序并没有必然联系,优先级低的线程也有可能比优先级高的线程先执行同步即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作直到该线程完成操作,其他线程才能对该内存地址进行操作,而其他线程又处于等待状态死锁当两个线程被阻塞,每个线程在等待另一个线程时就发生死锁守护实际的意思是把一个线程标记为“守护线程”就是当他是一个“后台线程”or“内部线程”线程安全线程安全是多线程编程时的计算机程序代码中的一个概念在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况.线程有哪几种状态?答线程在生命期中可能经历五种状态新建(New)、就绪或者可运行(ReadyorRunnable运行(Running)、阻塞(Blocked)、死亡(Dead).简述Java线程调度的原理答所有的Java虚拟机都有一个线程调度器,用来确定那个时刻运行那个线程主要包含两种抢占式线程调度器和协作式线程调度器.抢占式线程调度,每个线程可能会有自己的优先级,但是优先及并不意味着高优先级的线程一定会被调度,而是由cup随机的选择,所谓抢占式的线程调度,就是说一个线程在执行自己的任务时,虽然任务还没有执行完,但是cpu会迫使它暂停,让其它线程占有cpu的使用权.协作式线程调度,每个线程可以有自己的优先级,但优先级并不意味着高优先级的线程一定会被最先调度,而是由cpu时机选择的,所谓协作式的线程调度,就是说一个线程在执行自己的任务时,不允许被中途打断,一定等当前线程将任务执行完毕后才会释放对cpu的占有,其它线程才可以抢占该cpu4•何谓线程同步?何谓线程间通信?答同步就是使不同动作协调有序线程同步指的是当程序中有多个线程,假设它们同时访问同一个变量时,一些线程读数据,一些线程写数据,可能会出现数据读写错误,因此需要对这些线程的数据访问操作进行控制,使之协调有序,避免数据访问操作出错线程间通讯是多个线程在操作同一个资源时,多个线程之间不断切换执行时所发出的信号.分析下面程序的执行结果classSyncextendsThreadpublicsynchronizedvoidproduceProduct{ifproductCount20{productCount++;System.out.printlnThread.currentThread.getName+”开始生产第”+productCount+“个产品”;notify;}else{〃等待try{wait;}catchInterruptedExceptione{e.printStackTrace;}〃消费产品publicsynchronizedvoidconsumeProduct{ifproductCount0{System.out.printlnThread.currentThread.getName+”开始消费第+productCount+个产品”;productCount-;notify;}else{//等待trywait;}catchInterruptedExceptione{e.printStackTrace;classProducerextendsThread{〃生产者privateClerkclerk;publicProducerClerkclerk{this.clerk=clerk;@Overridepublicvoidrun{System.out.printlngetName+”:开始生产产品…”;whiletrue{tryThread.sleeplO;}catchInterruptedExceptione{e.printStackTrace;}clerk.produceProduct;classConsumerextendsThread{〃消费者privateClerkclerk;publicConsumerClerkclerk{this.clerk=clerk;}@Overridepublicvoidrun{System.out.printlngetName+”开始消费产品”;whiletrue{tryThread.sleep20;}catchInterruptedExceptione{e.printStackTrace;clerk.consumeProduct;publicclassProductTest{publicstaticvoidmainString[]args{Clerkclerk=newClerk;Producerpl=newProducerclerk;pl.setName生产者「;Consumercl=newConsumerclerk;cLsetName”消费者「;Consumerc2=newConsumerclerk;c
2.setName”消费者2pl.startQ;cl.start;c
2.start;StringBufferletter;publicSyncStringBufferletterthis.letter=letter;}publicvoidrunsynchronizedletterforintI=1;I=100;++ISystem.out.printletter;}System.out.printIn;chartemp=letter.charAt0;++temp;letter.setCharAt0temp;}}publicStringBuffersb=newStringBufferHAn;}答AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc由于使用synchronized关键字,程序的输出不会出现ABC字母的嵌套.分析下面的程序是否会形成死锁,谈谈理由packageexercise;publicclassExll6publicstaticvoidmainString[]argsprivateDeadlockRiskdead;privateintab;MyThread4DeadlockRiskdeadintaintbthis.dead=dead;this.b=b;@Overridepublicvoidrundead.read;dead.writeab;}classDeadlockRiskprivatestaticclassResourcepublicintvalue;privateResourceresourceA=newResource;privateResourceresourceB=newResource;publicintreadsynchronizedresourceASystemout.printInread:“+Thread.currentThread.getName+”获取了resourceA的锁!”;synchronizedresourceBSystem.out.printinread:n+Thread.currentThread.getName+”获取了resourceB的锁!“;returnresourceB.value+resourceA.value;}publicvoidwriteintaintbsynchronizedresourceBSystem.out.printinwrite:n+Thread.currentThread.getName+”获取了resourceA的锁!H;synchronizedresourceASystem.out.printInwrite:“+Thread.currentThread.getName+”获取了resourceB的锁!”;resourceA.value=a;resourceB.value=b;}答会出现死锁,因为两个线程被阻塞了.分析下面程序的功能packageexercise;classPlateprivateintindex=0;privatechar[]buffer=newchar
[6];publicsynchronizedvoidpushcharcwhileindex==buffer.lengthtrySystem.out.printInnTheplateisfullnoroomtoput*;this.wait;catchInterruptedExceptione}thisnotify;buffer[index]=c;index++;publicsynchronizedcharpopwhileindex==0trySystem.out.printInnTheplateisemptynoappletoeatn;this.wait;catchInterruptedExceptione}thisnotify;index--;returnbuffer[index];classFatherextendsThreadPlates;charch=*;FatherPlatesthis・s=s;publicvoidrunwhiletrues.pushch;System.out.printInnIputanapplen+ch+nintotheplate;}classChildextendsThreadPlates;charch;ChildPlatesthis.s=s;}publicvoidrunwhiletruech=s.pop;Systemout.printInnIgetanapple+ch+”fromtheplate*;}publicclassExll_7一publicstaticvoidmainStringargs[]Plates=newPlate;Fatherf=newFathers;Childc=newChilds;f.start;c.start;答产生两个线程,一个线程向堆栈插入字符2,,另外一个线程从堆栈弹出字母如果堆栈满了,或者空了给出相应的提示.分析下面程序的功能packageexercise;classNumberHolderprivateintnumber;publicsynchronizedvoidincrease{if0!=numbertrywait;catchInterruptedExceptionee.printStackTrace;}//能执行到这里说明已经被唤醒,并且number为0number++;System.out.printInnumber;//通知在等待的线程notify;publicsynchronizedvoiddecreaseif0==numbertry{wait;catchInterruptedExceptionee.printStackTrace;//能执行到这里说明已经被唤醒,并且number不为0number--;System.out.printInnumber;notify;classIncreaseThreadextendsThreadprivateNumberHoldernumberHolder;publicIncreaseThreadNumberHoldernumberHolder{this.numberHolder=numberHolder;@Overridepublicvoidrunforinti=0;i20;++i//进行一定的延时try{Thread.sleeplongMath.random*1000;catchInterruptedExceptione{e.printStackTrace;//进行增加操作numberHolder.increase;}classDecreaseThreadextendsThreadprivateNumberHoldernumberHolder;publicDecreaseThreadNumberHoldernumberHolderthis.numberHolder=numberHolder;@Overridepublicvoidrunforinti=0;i20;++i//进行一定的延时tryThread.sleeplongMath.random*1000;}catchInterruptedExceptione{e.printStackTrace;}//进行减少操作numberHolder.decrease;publicclassExll_8publicstaticvoidmainString[]argsNumberHoldernumberHolder=newNumberHolder;Threadtl=newIncreaseThreadnumberHolder;Threadt2=newDecreaseThreadnumberHolder;tl.start;t
2.start;}答产生两个线程IncreaseThread和DecreaseThread他们随机增加和减少NumberHolder的变量number各进行20次操作后,退出循环.项目练习哲学家就餐问题,是1965年由Dijkstra提出的一种线程同步的问题问题描述一个圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭上述问题会产生死锁的情况,当5个哲学家都拿起自己右手边的筷子,准备拿左手边的筷子时产生死锁现象解决办法思路1添加一个服务生,只有经过服务生同意之后才能拿筷子,服务生负责避免死锁发生2每个哲学家必须确定自己左右手的筷子都可用的时候,才能同时拿起两只筷子进餐,吃完之后同时放下两只筷子3规定每个哲学家拿筷子时必须拿序号小的那只,这样最后一位未拿到筷子的哲学家只剩下序号大的那只筷子,不能拿起,剩下的这只筷子就可以被其他哲学家使用,避免了死锁这种情况不能很好地利用资源答packageexercise;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;/***哲学家就餐问题*/classProj3_02{staticfinalLock[]locks=newLock
[5];static{fbrinti=0;ilocks.length;i++{locks[i]=newReentrantLock;publicstaticvoidmainString[]args{PhilosopherphilosopherO=newPhilosopher,张三”10000;Philosopherphilosopher1=newPhilosopher“李四”8001;Philosopherphilosopher2=newPhilosopher“王五”4002;Philosopherphilosopher3=newPhilosopher”jhl”20003;Philosopherphilosopher4=newPhilosopherghlcln20004;philosopher
0.start;philosopherl.start;philosopher
2.start;philosophers.start;philosopher
4.start;〃死循环,防止主线程退出导致进程关闭whiletrue{}}staticclassPhilosopherextendsThread{privateStringname;privatelongtime;privateintnum;publicPhilosopherStringnamelongtimeintnum{this.name=name;this.time=time;this.num=num;@Overridepublicvoidrun{whiletrue{System.out.printlnnum+”号哲学家+name+”正在思考.〃模拟思考的过程try{Thread.slecptime;}catchInterruptedExceptione{e.printStackTraceQ;System.out.printlnnum+”号哲学家+name+”饿了,想来吃饭..J;iflocks[num].tryLock{trySystem.out.printlnnum+”号哲学家”+name+”拿到了左边的筷子!”;iflocks[num+l%5].tryLock{try{System.out.printlnnum+n号哲学家+name+”拿到了右边的筷子!System.out.printlnnum+n号哲学家+name+”开始吃饭!”;〃模拟哲学家吃饭的过程Thread.sleeptime;}catchInterruptedExceptione{e.printStackTrace;}finally{System.out.printlnnum+n号哲学家”+name+”放下了右边的筷子!)locks[(num+l)%5].unlock();}}else{System.out.println(num+n号哲学家”+name+”没拿到了右边的筷子!被迫思考…,)}finally{System.out.println(num+”号哲学家”+name+”放下了左边的筷子!”);locks[num].unlock();)}else{System.out.println(num+”号哲学家”+name+”没拿到了左边的筷子!被迫思考…))System.out.println(num+”号哲学家”+name+”思考ing...);//模拟思考过程try{Thread.sleep(time);}catch(InterruptedExceptione){e.printStackTraceQ;}}}})
10.项目练习生产者消费者问题,准确地说是“生产者一消费者一仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了对于此模型,应该明确以下4点
(1)生产者仅仅在仓储未满时生产,仓满则停止生产
(2)消费者仅仅在仓储有产品时才能消费,仓空则等待
(3)当消费者发现仓储没产品可消费时会通知生产者生产
(4)生产者在生产出可消费产品时,应该通知等待的消费者去消费此模型将要结合java.lang.Object的wait与notifynotifyAll方法来实现以上的需求这是非常重要的答packagecom.klvchen.java2;classClerk{privateintproductCount=0;〃生产产品。