sell();
}
}
}
}
}
publicclassXt2{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
TicketSystemts=newTicketSystem(100);
for(inti=0;i<10;i++){
ts.thread[i].start();
}
}
}
运行结果:
实验题3假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。
现有两个顾客,每人都分3次,每次100元将钱到入。
试编写一个程序,模拟实际作业。
程序如下:
classCBank
{privatestaticintsum=0;
publicstaticvoidadd(intn){
inttmp=sum;
tmp=tmp+n;//累加汇款总额
try{
Thread.sleep((int)(10000*Math.random()));//小睡几秒钟
}
catch(InterruptedExceptione){}
sum=tmp;
System.out.println("sum="+sum);
}
}
classCCustomerextendsThread//CCustomer类,继承自Thread类
{publicvoidrun(){//run()method
for(inti=1;i<=3;i++)
CBank.add(100);//将100元分三次汇入
}
}
publicclassEx6_1
{publicstaticvoidmain(Stringargs[])
{CCustomerc1=newCCustomer();
CCustomerc2=newCCustomer();
c1.start();c2.start();
}
}
[基本要求]运行程序5次,观察每次运行结果是否相同。
经验证知每次运行结果不相同。
[思考问题]程序运行结果每次是否相同,运行时间是否相同,为什么?
运行结果每次都不相同,运行时间也不相同,因为Thread.sleep((int)(1000*Math.random()));该语句随机产生一个时间。
1要使程序运行结果每次相同,应该怎样修改程序?
在CBank类中add(intn)的方法中加入synchronized,使得线程同步。
②程序中为什么要使用异常处理?
因为Thread的方法:
publicstaticvoidsleep(longmillis,
intnanos)
throwsInterruptedException
抛出异常,所以必须对异常进行处理
实验题4在程序中主动产生一个ArithmeticException类型被0除的异常,并用catch语句捕获这个异常。
最后通过ArithmeticException类的对象e的方法getMessage给出异常的具体类型并显示出来。
代码:
packagecn.shangji.ThreadDemo;
publicclassxt4{
/**
*@paramargs
*/
privatestaticinti=12;
privatestaticintj=0;
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
try{
intsum=i/j;
}catch(ArithmeticExceptione){
//TODO:
handleexception
System.out.println("通过e的方法getMessage显示异常详细消息为:
");
System.out.println(e.getMessage());
}
}
}
运行结果:
实验题5在一个类的静态方法mathod()方法内使用throw产生异常,使用throws子句抛出mathod()的异常,在main方法中捕获处理异常。
代码:
packagecn.shangji.ThreadDemo;
publicclassxt5{
/**
*@paramargs
*@throwsException
*/
publicstaticvoidthrowException()throwsException{
try{
thrownewException("新建自定义异常");
}catch(Exceptione){
//TODO:
handleexception
throwe;
}
}
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
try{
throwException();
}catch(Exceptione){
//TODO:
handleexception
System.out.println("捕获异常"+e);
}
}
}
运行结果:
实验题6在try子句中设计两个以上可能出现的异常。
通过多个catch子句分别来捕获异常。
并使用finally子句确保一段代码不管发生什么异常都能被执行。
代码:
packagecn.shangji.ThreadDemo;
importjava.io.FileReader;
importjava.io.IOException;
publicclassXt6{
/**
*@paramargs
*/
staticinti;
staticStringstr="习题六";
staticinta[]=newint[10];
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
try{
System.out.println(a[11]);
FileReaderfsr=newFileReader("xt6.java");
}catch(ArrayIndexOutOfBoundsExceptione){
//TODO:
handleexception
System.out.println(e);
}
catch(IOExceptionioe){
str=ioe.getMessage();
System.out.println(ioe);
}
finally{
System.out.println("finally语句执行!
");
}
}
}
运行结果:
实验题7编写一个程序,输入一个班某门课程成绩,统计及格人数、不及格人数平均分。
为此设计一个异常类,当输入的成绩小于0分或大于100分时,抛出异常,程序将捕捉这个异常,并作出相应处理。
[基本要求]编写完整程序
代码:
packagecn.shangji.ThreadDemo;
importjava.util.Scanner;
@SuppressWarnings("serial")
classScoreExceptionextendsException{
Stringmessage;
publicScoreException(doublei){
message="当请输入的成绩:
"+i+"不合理,请重新输入!
!
!
";
}
publicStringtoString(){
returnmessage;
}
}
publicclassXt7{
/**
*@paramargs
*/
intpass,unPass,n;
doublesum;
publicXt7(intn){
this.n=n;
}
publicvoidsetScore()throwsScoreException{
doublei=0;
for(intj=0;jScannersc=newScanner(System.in);
i=sc.nextDouble();
if(i>100||i<0){
thrownewScoreException(i);
}else{
if(i>=60){
++pass;
}
else
++unPass;
}
sum+=i;
}
}
publicvoidshow(){
System.out.println("及格人数为:
"+pass);
System.out.println("不及格人数为:
"+unPass);
System.out.println("平均分为:
"+sum/n);
}
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
System.out.println("请输入要统计的人数:
");
Scannersc1=newScanner(System.in);
intm=sc1.nextInt();
Xt7score=newXt7(m);
System.out.println("请输入成绩:
");
try{
score.setScore();
score.show();
}catch(ScoreExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
运行结果:
如果出现异常:
感想:
本次实验复习了异常类,对异常处理熟悉了。
异常类是个很重要的类,很多时候都需要加入异常处理。
可以根据异常修改程序的错误。
线程可以实现多个任务同时执行,提高cpu利用率。