您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > JAVA多线程的实验报告-
深圳大学实验报告课程名称:Java程序设计实验项目名称:线程学院:计算机与软件学院专业:指导教师:谭舜泉报告人:学号:班级:3班实验时间:2012年12月13日实验报告提交时间:2012年12月26日教务部制一、实验内容:8.2.3吵醒休眠的线程实验代码:classShopimplementsRunnable{ThreadzhangWorker,wangWorker,boss;Shop(){boss=newThread(this);//创建boss,Shop对象为boss目标对象zhangWorker=newThread(this);wangWorker=newThread(this);zhangWorker.setName(张工);wangWorker.setName(王工);boss.setName(老板);}publicvoidrun(){inti=0;if(Thread.currentThread()==zhangWorker){while(true){try{i++;System.out.printf(\n%s已搬运了%d箱苹果\n,zhangWorker.getName(),i);if(i==3)return;Thread.sleep(10000);}//zhangWorker休眠10秒}catch(InterruptedExceptione){System.out.printf(\n%s让%s继续工作,boss.getName(),zhangWorker.getName());}}}elseif(Thread.currentThread()==wangWorker){while(true){try{i++;System.out.printf(\n%s已搬运了%d箱香蕉\n,wangWorker.getName(),i);if(i==3)return;Thread.sleep(10000);}catch(InterruptedExceptione){System.out.printf(\n%s让%s继续工作,boss.getName(),wangWorker.getName());}}}elseif(Thread.currentThread()==boss){while(true){zhangWorker.interrupt();//吵醒zhangWorkerwangWorker.interrupt();if(!(wangWorker.isAlive()||zhangWorker.isAlive())){System.out.printf(%n%s下班,boss.getName());return;}}}}}publicclassShopExample{publicstaticvoidmain(Stringargs[]){Shopshop=newShop();shop.zhangWorker.start();shop.wangWorker.start();shop.boss.start();}}实验截图:8.2.4排队买票实验代码:classTicketSeller//负责卖票的类{intfiveNumber=1,tenNumber=0,twentyNumber=0;publicsynchronizedvoidsellTicket(intreceiveMoney,intbuyNumber){if(receiveMoney==5){fiveNumber=fiveNumber+1;System.out.printf(\n%s给我5元钱,这是您的1张入场券,Thread.currentThread().getName());}elseif(receiveMoney==10&&buyNumber==2){tenNumber=tenNumber+1;System.out.printf(\n%s给我10元钱,这是您的2张入场券,Thread.currentThread().getName());}elseif(receiveMoney==10&&buyNumber==1){while(fiveNumber1)//给出线程等待的条件{try{System.out.printf(\n%s靠边等,Thread.currentThread().getName());wait();//线程进入等待状态System.out.printf(\n%30s结束等待状态\n,Thread.currentThread().getName());}catch(InterruptedExceptione){}}fiveNumber=fiveNumber-1;tenNumber=tenNumber+1;System.out.printf(\n%s给我10元钱,找您5元钱,这是您的1张入场券,Thread.currentThread().getName());}elseif(receiveMoney==20&&buyNumber==1){while(fiveNumber1||tenNumber1)//给出线程需要等待的条件{try{System.out.printf(\n%30s靠边等,Thread.currentThread().getName());wait();//线程进入等待状态System.out.printf(\n%30s结束等待,Thread.currentThread().getName());}catch(InterruptedExceptione){}}fiveNumber=fiveNumber-1;tenNumber=tenNumber-1;twentyNumber=twentyNumber+1;System.out.printf(\n%s给我20元钱,找您一张5元和一张10元,这是您的1张入场券,Thread.currentThread().getName());}elseif(receiveMoney==20&&buyNumber==2){while(tenNumber1)//给出线程等待的条件{try{System.out.printf(\n%30s靠边等\n,Thread.currentThread().getName());wait();//线程进入的等待状态System.out.printf(\n%30s结束等待,Thread.currentThread().getName());}catch(InterruptedExceptione){}}tenNumber=tenNumber-1;twentyNumber=twentyNumber+1;System.out.printf(\n%s给我20元钱,找您一张10元,这是您的2张入场券,Thread.currentThread().getName());}notifyAll();//通知等待的线程结束等待}}classCinemaimplementsRunnable{Threadzhao,qian,sun,li,zhou;TicketSellerseller;Cinema(){zhao=newThread(this);qian=newThread(this);sun=newThread(this);li=newThread(this);zhou=newThread(this);zhao.setName(赵);qian.setName(钱);sun.setName(孙);li.setName(李);zhou.setName(周);seller=newTicketSeller();}publicvoidrun(){if(Thread.currentThread()==zhao)seller.sellTicket(20,2);elseif(Thread.currentThread()==qian)seller.sellTicket(20,1);elseif(Thread.currentThread()==sun)seller.sellTicket(10,1);elseif(Thread.currentThread()==li)seller.sellTicket(10,2);elseif(Thread.currentThread()==zhou)seller.sellTicket(5,1);}}publicclassSaleExample{publicstaticvoidmain(Stringargs[]){Cinemacinema=newCinema();cinema.zhao.start();try{Thread.sleep(1000);}catch(InterruptedExceptione){}cinema.qian.start();try{Thread.sleep(1000);}catch(InterruptedExceptione){}cinema.sun.start();try{Thread.sleep(1000);}catch(InterruptedExceptione){}cinema.li.start();try{Thread.sleep(1000);}catch(InterruptedExceptione){}cinema.zhou.start();}}实验截图:二、实验体会:对于实验“吵醒睡眠的线程”,让我更熟悉了interrupt()方法的使用,interrupt()方法常用来“吵醒”休眠的线程。当一些线程调用了sleep()方法处于休眠状态时,一个只用CPU资源的其他线程在执行的过程中,可以让休眠的线程分别调用interrupt()方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。打完代码后,反复运行程序,发现每次程序运行后输出的结果都不一样,可能是运行过程中间断的时间比较短,间隔时间稍长一点,结果就不会变的这么频繁了。对于实验“排队买票”,更多的使用了wait()、notify()和notifyAll()方法。对3个方法的解释:一个线程使用的同步方法中用到某个变量,而此变量又需要其他线程修改后才能符合本线程的需要时,可以在同步方法中使用wait()方法,其可以中断方法的执行,是本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。用notifyAll()通知所有的由于使用同步方法而处于等待的线程结束等待。曾中断的线程就会重新排队等待CPU资源,以便从刚才的中断处执行这个同步方法,也可以用notify()方法通知处于等待线程中的某一个结束等待。
本文标题:JAVA多线程的实验报告-
链接地址:https://www.777doc.com/doc-5104799 .html