您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > java实验14-多线程1---答案
实验十四多线程(一)一、实验时间:姓名:学号:二、实验目的1、了解线程的概念;2、掌握通过Thread类创建线程;3、掌握通过Runnable接口创建多线程;4、掌握多线程的同步;三、知识点1、线程的概念;2、通过Thread类创建线程;3、通过Runnable接口创建多线程;4、同步函数四、实验内容与步骤1、请思考并举例说明为何需要多线程,实现多线程的好处是什么?2、编程实现以下功能:通过主线程控制另外两个线程,这两个线程分别在命令行窗口的左侧和右侧顺序地、一行一行地输出字符串。主线程负责判断输出的行数,当其中任何一个线程输出8行后就结束进程。要求:分别使用Thread的子类和Runable接口创建线程。1)使用Thread的子类完成//主线程程序publicclassExample8_3{publicstaticvoidmain(String[]args){Leftleft=newLeft();Rightright=newRight();left.start();right.start();while(true){if(left.n==8||right.n==8){System.exit(0);}}}}//左边线程publicclassLeftextendsThread{intn=0;publicvoidrun(){while(true){n++;System.out.printf(\n%s,我在左面写字);try{sleep((int)(Math.random()*100)+100);}catch(InterruptedExceptione){}}}}//右边线程publicclassRightextendsThread{intn=0;publicvoidrun(){while(true){n++;System.out.printf(\n%40s,我在右面写字);try{sleep((int)(Math.random()*100)+100);}catch(InterruptedExceptione){}}}}2)Runable接口创建线程//主线程程序publicclassExample8_4{publicstaticvoidmain(String[]args){Left1l1=newLeft1();newThread(l1).start();Right1r1=newRight1();newThread(r1).start();while(true){if(l1.n==8||r1.n==8){System.exit(0);}}}}//左边线程publicclassLeft1implementsRunnable{intn=0;@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubwhile(true){n++;System.out.printf(\n%s,我在左面写字);try{Thread.sleep((int)(Math.random()*100)+100);}catch(InterruptedExceptione){}}}}//右边线程publicclassRight1implementsRunnable{intn=0;@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubwhile(true){n++;System.out.printf(\n%40s,我在右面写字);try{Thread.sleep((int)(Math.random()*100)+100);}catch(InterruptedExceptione){}}}}3、编程模拟四个售票进程共同出售100张火车票,要保证线程安全。publicclassThreadTestimplementsRunnable{privateinttickets=100;@Overridepublicvoidrun(){while(true)sale();}publicsynchronizedvoidsale(){if(tickets0){System.out.println(Thread.currentThread().getName()+issalingticket+tickets--);}}}publicclassThreadDemo{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubeThreadTestt=newThreadTest();newThread(t).start();newThread(t).start();newThread(t).start();newThread(t).start();}}4、创建两个线程:accountant和cashier,它们共同拥有一个账本。它们都可以使用saveOrTake(intnumber)对账本进行访问,会计使用saveOrTake()方法时,向账本上写入存钱记录;出纳使用saveOrTake()方法时,向账本写入取钱记录。因此,当会计正在使用saveOrTake()方法时,出纳被禁止使用,反之也是这样。比如,会计每次使用saveOrTake()方法时,在账本上存入90万元,在存入这笔钱时,分3次存完,每存入30万元,就休息一会儿,休息时出纳仍不能使用saveOrTake()方法。要保证其中一人使用saveOrTake()方法时,另一个人将必须等待。//Bank.javapublicclassBankimplementsRunnable{intmoney=300;StringaccountantName,cashierName;publicBank(Strings1,Strings2){accountantName=s1;cashierName=s2;}publicvoidrun(){//TODOAuto-generatedmethodstubsaveOrTake(30);}publicsynchronizedvoidsaveOrTake(intnumber){if(Thread.currentThread().getName().equals(accountantName)){for(inti=1;i=3;i++){money=money+number;try{Thread.sleep(1000);}catch(InterruptedExceptione){}System.out.println(我是:+accountantName+目前账上有+money+万);}}else{for(inti=1;i=2;i++){money=money-number/2;try{Thread.sleep(1000);}catch(InterruptedExceptione){}System.out.println(我是:+cashierName+目前账上有+money+万);}}}}//publicclassExample8_11{publicstaticvoidmain(String[]args){StringaccountantName=会计,cashierName=出纳;Bankbank=newBank(accountantName,cashierName);Threadaccountant,cashier;accountant=newThread(bank);cashier=newThread(bank);accountant.setName(accountantName);cashier.setName(cashierName);accountant.start();cashier.start();}}五、实验后记收获与体会出现的错误与解决(概述)教师评语
本文标题:java实验14-多线程1---答案
链接地址:https://www.777doc.com/doc-2060206 .html