多线程异常处理.docx
《多线程异常处理.docx》由会员分享,可在线阅读,更多相关《多线程异常处理.docx(14页珍藏版)》请在冰豆网上搜索。
![多线程异常处理.docx](https://file1.bdocx.com/fileroot1/2023-6/4/4d8ad8cc-cd6a-4b9d-ac60-1c02b9962b6f/4d8ad8cc-cd6a-4b9d-ac60-1c02b9962b6f1.gif)
多线程异常处理
实验四多线程异常处理
1.实验目的
(1)掌握Java的异常处理机制及相关实现方法能够在程序设计中熟练运用异常及相关类及对象;
(2)掌握Java多线程的概念和实现方法;
(3)掌握Java多线程的同步问题;
2.实验内容
实验题1创建两个线程,一个线程打印“A”,另一个线程打印“B”,比如ABBABAABBA….
实验代码:
packagexuguigui;
publicclassSimpleThreadextendsThread{
publicSimpleThread(Stringname)
{
setName(name);
}
publicvoidrun(){
inti=0;
while(i++<5){
try{
System.out.print(getName()+"");
//Thread.sleep(1000);
}
catch(Exceptione){
e.printStackTrace();
}
}
}
}
packagexuguigui;
publicclassXu{
publicstaticvoidmain(String[]args){
SimpleThreadthread1=newSimpleThread("A");
SimpleThreadthread2=newSimpleThread("B");
thread1.start();
thread2.start();
}
}
程序运行结果:
实验题2假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒买一张票。
打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。
输出格式如下:
第4售票点卖出第100张票
第2售票点卖出第101张票……
程序代码:
packagexx;
publicclasstestxxextendsThread{
intticket=200;
Stringname="";
publicvoidrun(){
while(true){
synchronized(name){
if(ticket<=0)
break;
System.out.println("第"+Thread.currentThread().getName()
+"售票点卖出第"+ticket--+"张票");
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
}
packagexx;
publicclassTicket{
publicstaticvoidmain(String[]args){
testxxt=newtestxx();
newThread(t,"1").start();
newThread(t,"2").start();
newThread(t,"3").start();
newThread(t,"4").start();
newThread(t,"5").start();
newThread(t,"6").start();
newThread(t,"7").start();
newThread(t,"8").start();
newThread(t,"9").start();
newThread(t,"10").start();
}
}
程序运行结果:
此题主要考察synchronized()同步代码块的理解和使用。
在程序中执行到synchronized设定的同步化区块时锁定当前对象,这样就没有其他线程可以执行这个被同步化的区块了。
另,代码中调用了Thread类中的currentThread()方法,返回对当前正在执行的线程对象的引用。
实验题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次,观察每次运行结果是否相同。
[思考问题]程序运行结果每次是否相同,运行时间是否相同,为什么?
1要使程序运行结果每次相同,应该怎样修改程序?
将睡眠时间由原来的随机改成一个确定的毫秒数,比如sleep(100),则运行结果和运行时间就一样了。
2程序中为什么要使用异常处理?
执行sleep()方法后,当前线程将休眠指定的时间段,如果任何一个线程中断了当前线程的休眠,该方法将抛出InterruptedException异常对象,所以在使用sleep()方法时,必须捕获该异常。
实验题4在程序中主动产生一个ArithmeticException类型被0除的异常,并用catch语句捕获这个异常。
最后通过ArithmeticException类的对象e的方法getMessage给出异常的具体类型并显示出来。
程序代码:
packagexx;
publicclassTest{
publicstaticvoidmain(String[]arg3){
System.out.println("这是一个异常处理的例子\n");
try{
inti=10;
i/=0;
}catch(ArithmeticExceptione){
System.out.println("异常是:
"+e.getMessage());
}finally{
System.out.println("finally语句被执行");
}
}
}
程序运行结果:
实验题5在一个类的静态方法mathod()方法内使用throw产生异常,使用throws子句抛出mathod()的异常,在main方法中捕获处理异常。
程序代码:
packagexx;
publicclassTest2{
staticvoidthrowProcess(){
try{
thrownewNullPointerException("空指针异常");
}catch(NullPointerExceptione){
System.out.println("\n在throwProcess方法中捕获一个"+e.getMessage());
throwe;
}
}
publicstaticvoidmain(Stringargs[]){
try{
throwProcess();
}catch(NullPointerExceptione){
System.out.println("再次捕获:
"+e);
}
}
}
程序运行结果:
实验题6在try子句中设计两个以上可能出现的异常。
通过多个catch子句分别来捕获异常。
并使用finally子句确保一段代码不管发生什么异常都能被执行。
程序代码:
packagexx;
publicclassCatch{
publicstaticvoidmain(String[]args){
int[]a={1,2,3,4,5};
int[]b={1,0,3,0};
for(inti=0;itry{
System.out.println(a[i]/b[i]);
}catch(ArrayIndexOutOfBoundsExceptionm){
System.out.println("数组下表越界!
");
System.out.println("错误:
"+m.getMessage());
}catch(RuntimeExceptione){
System.out.println("除数不能为零!
");
System.out.println("错误:
"+e.getMessage());
//TODOAuto-generatedcatchblock
}finally{
System.out.println("finally后面的语句永久打印!
");
}
}
}
程序运行结果:
实验题7编写一个程序,输入一个班某门课程成绩,统计及格人数、不及格人数平均分。
为此设计一个异常类,当输入的成绩小于0分或大于100分时,抛出异常,程序将捕捉这个异常,并作出相应处理。
[基本要求]编写完整程序
程序代码:
packagexx;
classMinusExceptionextendsArithmeticException{
publicMinusException(){
}
publicMinusException(Stringstr){
super(str);
}
}
packagexx;
classOverExceptionextendsArithmeticException{
publicOverException(){
}
publicOverException(Stringstr){
super(str);
}
}
packagexx;
importjava.util.*;
publicclassTestScore{
publicstaticvoidjudgescore(inti)throwsMinusException,OverException{
if(i<0)
thrownewMinusException("分数不能为负数");
if(i>100)
thrownewOverException("分数超过100,过大!
");
}
publicstaticvoidmain(String[]args){
intarray[]={0,0};
intturn=1;
doubletotal=0;
Scannerinput=newScanner(System.in);
intscore=0;
System.out.println("请输入学生成绩,输入-1退出:
");
System.out.print("请输入"+turn+"个学生成绩:
");
score=input.nextInt();
while(score!
=-1){
try{
judgescore(score);
if(score<60)
++array[0];
if(score>=60)
++array[1];
total+=score;
}catch(MinusExceptione1){
System.err.println(e1+"\n");
}catch(OverExceptione2){
System.err.println(e2+"\n");
}catch(ArithmeticExceptione3){
System.err.println("其它异常"+"\n");
}
turn++;
System.out.print("请输入"+turn+"个学生成绩:
");
score=input.nextInt();
}
System.out.println("不及格人数:
"+array[0]);
System.out.println("及格人数:
"+array[1]);
System.out.println("平均分:
"+total/(array[0]+array[1]));
}
}
程序运行结果:
实习总结:
本次实习遇到困难不少,对书本不够熟悉。
出师表
两汉:
诸葛亮
先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。
然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。
诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
宫中府中,俱为一体;陟罚臧否,不宜异同。
若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。
侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:
愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:
愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。
先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。
侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也。
臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。
先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。
后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
先帝知臣谨慎,故临崩寄臣以大事也。
受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。
今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。
此臣所以报先帝而忠陛下之职分也。
至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。
若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。
臣不胜受恩感激。
今当远离,临表涕零,不知所言。