您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > java实验报告12
实验报告(2014/2015学年第2学期)课程名称JAVA程序设计实验名称多线程实验时间2015年6月2日指导单位计算机学院/软件学院软件工程系指导教师周莉学生姓名班级学号学院(系)计算机软件学院专业计算机科学与技术1实验名称字符串和这则表达式指导教师周莉实验类型上机实验学时2实验时间2015-6-2一、实验目的1.熟悉利用Thread类建立多线程的方法2.熟悉利用Runnble接口建立多线程的方法二、实验环境(实验设备)1.每位学生配备计算机一台2.计算机需安装好JDK和Jcreator三、实验内容1.创建两个线程,第一个线程启动调用wait()方法进入阻塞状态,等待另一个线程来唤醒;第二个线程启动后睡眠一段时间,苏醒后调用notifyall()方法唤醒处于阻塞状态的另一个线程。importjava.lang.*;importjava.io.*;publicclasssy12_1{publicstaticvoidmain(Stringargs[]){Objectdummy=newObject();Threadt1=newThread1(dummy);Threadt2=newThread2(dummy);t1.start();t2.start();}}classThread1extendsThread{Objectdummy;publicThread1(Objects){dummy=s;System.out.println(Threadisconstructed);}publicvoidrun(){try{System.out.println(Thread1starts);System.out.println(Thread1waitforThread2tonotifyit);synchronized(dummy){dummy.wait();}System.out.println(ThreadiswakennedupbyThread2);}catch(Exceptione){}2}}classThread2extendsThread{Objectdummy;publicThread2(Objects){dummy=s;System.out.println(Thread2isconstructed);}publicvoidrun(){try{System.out.println(Thread2starts);sleep(10000);synchronized(dummy){dummy.notifyAll();}}catch(Exceptione){}}}2.编写一个有两个线程的程序,第一个线程用来计算2~100000之间的质数及个数,第二个线程用来计算100000~200000之间的质数及个数。publicclassUserThreadextendsThread{intst,en,count=0;UserThread(intm,intn){this.st=m;this.en=n;}publicvoidrun(){for(intm=st;m=en;m++){booleanisPrime=true;3for(inti=2;im;i++)if(m%i==0){isPrime=false;break;}if(isPrime)count++;}System.out.println(st+~+en+之间一共有+count+个质数);}publicstaticvoidmain(Stringargs[]){UserThreadthread1=newUserThread(2,100000);UserThreadthread2=newUserThread(100000,200000);thread1.start();thread2.start();}}3.线程zhang和cheng使用同一目标对象。两个线程共享目标对象的money。当money的值小于100时,线程zhang结束自己的run()方法进入死亡状态;当money的值小于60时,线程cheng结束自己的run()方法进入死亡状态,(效果见154图8-2所示)。publicclasssy12_3{publicstaticvoidmain(Stringargs[]){Strings1=会计,s2=出纳;Bankbank=newBank(s1,s2);Threadzhang,cheng;zhang=newThread(bank);cheng=newThread(bank);zhang.setName(s1);cheng.setName(s2);bank.setMoney(120);zhang.start();cheng.start();}}classBankimplementsRunnable{privateintmoney=0;4Stringname1,name2;Bank(Strings1,Strings2){name1=s1;name2=s2;}publicvoidsetMoney(intmount){money=mount;}publicvoidrun(){while(true){money=money-10;if(Thread.currentThread().getName().equals(name1)){System.out.println(我是+name1+现在有+money+元);if(money=100){System.out.println(name1+进入死亡状态);return;}}elseif(Thread.currentThread().getName().equals(name2)){System.out.println(我是+name2+现在有+money+元);if(money=60){System.out.println(name2+进入死亡状态);return;}}try{Thread.sleep(800);}catch(InterruptedExceptione){}}}}54.模拟3个人排队买票,每人买1张票。售票员只有1张五元的钱,电影票5元钱一张,张某拿1张二十元的人民币排在孙某前面买票,孙某拿1张十十元的人民币排在赵某前面买票,赵某拿1张五元的人民币排在最后面。那么,最终的买票次序应当是孙、赵、张(效果见教材163如图8-9所示)。publicclasssy12_4{publicstaticvoidmain(Stringargs[]){Strings1=张三,s2=孙大名,s3=找中堂;Cinemacanema=newCinema(s1,s2,s3);Threadzhang,sun,zhao;zhang=newThread(canema);sun=newThread(canema);zhao=newThread(canema);zhang.setName(s1);sun.setName(s2);zhao.setName(s3);zhang.start();sun.start();zhao.start();}}classCinemaimplementsRunnable{TicketSellerseller;Stringname1,name2,name3;Cinema(Strings1,Strings2,Strings3){seller=newTicketSeller();name1=s1;name2=s2;name3=s3;}publicvoidrun(){if(Thread.currentThread().getName().equals(name1)){seller.sellTicket(20);}elseif(Thread.currentThread().getName().equals(name2)){seller.sellTicket(10);}elseif(Thread.currentThread().getName().equals(name3)){seller.sellTicket(5);}}}classTicketSeller{intfiveNumber=1,tenNumber=0,twentyNumber=0;publicsynchronizedvoidsellTicket(intreceiveMoney){6Strings=Thread.currentThread().getName();if(receiveMoney==5){fiveNumber=fiveNumber+1;System.out.println(s+给售票员5元钱,售票员卖给+s+一张票,不必找赎);}elseif(receiveMoney==10){while(fiveNumber1){try{System.out.println(s+给售票员10元钱);System.out.println(售票员请+s+靠边等一会);wait();System.out.println(s+结束等待,继续买票);}catch(InterruptedExceptione){}}fiveNumber=fiveNumber-1;tenNumber=tenNumber+1;System.out.println(s+给售票员10元钱,售票员卖给+s+一张票,找赎5元);}elseif(receiveMoney==20){while(fiveNumber1||tenNumber1){try{System.out.println(s+给售票员20元钱);System.out.println(售票员请+s+靠边等一会);wait();System.out.println(s+结束等待,继续买票);}catch(InterruptedExceptione){}}fiveNumber=fiveNumber-1;tenNumber=tenNumber+1;twentyNumber=twentyNumber+1;System.out.println(s+给售票员20元钱,售票员卖给+s+一张票,找赎15元);}notifyAll();}}78四、实验小结(包括问题和解决方法、心得体会等)通过这次实验,我熟悉了用Thread类建立多线程的方法和用Runnble接口建立多线程的方法,通过这个实验,我对上课老师所讲的知识又有了更深的了解,巩固了上课的知识,在实验过程中,会出现一些错误,但只要我们足够细心,都能够找出错误所在,还有一些语法上的错误,还需要我们多加练习,学好这门课。五、指导教师评语成绩批阅人日期
本文标题:java实验报告12
链接地址:https://www.777doc.com/doc-3260662 .html