实验报告实验四.docx
- 文档编号:6769078
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:15
- 大小:57.79KB
实验报告实验四.docx
《实验报告实验四.docx》由会员分享,可在线阅读,更多相关《实验报告实验四.docx(15页珍藏版)》请在冰豆网上搜索。
实验报告实验四
北京林业大学
2013学年—2014学年第2学期Java程序设计基础实验报告书
专业:
电子班级:
11-2
姓名:
唐诗学号:
111114222
实验地点:
任课教师:
黄儒乐
实验题目:
多线程的使用
实验环境:
Windows2000/XP;局域网
实验要求:
1.对所有实验内容中涉及到的命令均要亲自实践,对照实验指导书进行。
2.把实验中出现的问题以及最后解决的情况反馈到实验报告中。
3.程序作业的源代码要求反馈到实验报告中。
实验内容:
1.线程的状态
按模板要求,将【代码1】~【代码10】替换为Java程序代码。
ThreadExample.java
classTortoiseextendsThread
{
intsleepTime=0,liveLength=0;
Tortoise(intsleepTime,Stringname,intliveLength)
{
this.sleepTime=sleepTime;
this.liveLength=liveLength;
【代码1】//设置线程的名字为name
}
publicvoidrun()
{
while(true)
{
liveLength--;
System.out.printf("@");
try
{
【代码2】//让线程调用sleep方法进入中断状态,sleepTime毫秒后线程
//重新排队,等待CPU资源
}
catch(InterruptedExceptione)
{
}
if(liveLength<=0)
{
System.out.printf(getName()+"进入死亡状态\n");
【代码3】//结束run方法的语句
}
}
}
}
classRabbitextendsThread
{
intsleepTime=0,liveLength;
Rabbit(intsleepTime,Stringname,intliveLength)
{
this.sleepTime=sleepTime;
this.liveLength=liveLength;
【代码4】//设置线程的名字为name
}
publicvoidrun()
{
while(true)
{
liveLength--;
System.out.printf("*");
try
{
【代码5】//让线程调用sleep方法进入中断状态,sleepTime毫秒后
//线程重新排队,等待CPU资源
}
catch(InterruptedExceptione)
{
}
if(liveLength<=0)
{
System.out.printf(getName()+"进入死亡状态\n");
【代码6】//结束run方法的语句
}
}
}
}
publicclassThreadExample
{
publicstaticvoidmain(Stringargs[])
{
Rabbitrabit;
rabit=【代码7】//新建线程rabit
Tortoisetortoise;
tortoise=【代码8】//新建线程tortoise
【代码9】//启动线程tortoise
【代码10】//启动线程rabit
}
}
2.使用Runnable方法
按模板要求,将【代码1】~【代码10】替换为Java程序代码。
BankExample.java
classBankimplementsRunnable
{
【代码1】//声明一个int型变量money,初值为100
Threadzhang,keven;
Bank()
{
【代码2】//创建zhang,Bank对象为zhang的目标对象
【代码3】//设置zhang线程的名字为“会计”
【代码4】//创建keven,Bank对象为keven的目标对象
【代码5】//设置keven线程的名字为“出纳”
}
publicvoidrun()
{
【代码6】//声明一个int类型变量i,初值为0
while(true)
{
if(【代码7】)//判断线程zhang是否正在占有CPU资源
{
i=i+1;
money=money+1;
System.out.printf("\n%s将money的值改为%d\t",zhang.getName(),money);
System.out.printf("%s的局部变量i=%d\n",zhang.getName(),i);
if(i>=6)
{
System.out.printf("%s线程进入死亡状态\n",zhang.getName());
【代码8】//使得线程zhang进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedExceptione)
{
}
}
elseif(【代码9】)//判断线程keven是否正在占有CPU资源
{
i=i-1;
money=money-1;
System.out.printf("\n%s将money的值改为%d\t",keven.getName(),money);
System.out.printf("%s的局部变量i=%d\n",keven.getName(),i);
if(i<=-6)
{
System.out.printf("%s线程进入死亡状态\n",keven.getName());
【代码10】//使得线程keven进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedExceptione)
{
}
}
}
}
}
classBankExample
{
publicstaticvoidmain(Stringargs[])
{
Bankbank=newBank();
bank.zhang.start();
bank.keven.start();
}
}
3.线程同步实验
分析上面BankExample的输出,是否发现money数据输出有误,请将针对money值的操作写成一个同步方法,解决上述问题。
实验目的:
掌握两种线程创建的方法,掌握线程控制的基本方法。
实现方法及结果
1.ThreadExample.java
classTortoiseextendsThread
{
intsleepTime=0,liveLength=0;
Tortoise(intsleepTime,Stringname,intliveLength)
{
this.sleepTime=sleepTime;
this.liveLength=liveLength;
setName(name);//设置线程的名字为name
}
publicvoidrun()
{
while(true)
{
liveLength--;
System.out.print("@");
try
{
sleep(sleepTime);//让线程调用sleep方法进入中断状态,sleepTime毫秒后线程
//重新排队,等待CPU资源
}
catch(InterruptedExceptione)
{
}
if(liveLength<=0)
{
System.out.print(getName()+"进入死亡状态\n");
stop();//结束run方法的语句
}
}
}
}
classRabbitextendsThread
{
intsleepTime=0,liveLength;
Rabbit(intsleepTime,Stringname,intliveLength)
{
this.sleepTime=sleepTime;
this.liveLength=liveLength;
setName(name);//设置线程的名字为name
}
publicvoidrun()
{
while(true)
{
liveLength--;
System.out.print("*");
try
{
sleep(sleepTime);//让线程调用sleep方法进入中断状态,sleepTime毫秒后
//线程重新排队,等待CPU资源
}
catch(InterruptedExceptione)
{
}
if(liveLength<=0)
{
System.out.print(getName()+"进入死亡状态\n");
stop();//结束run方法的语句
}
}
}
}
publicclassThreadExample
{
publicstaticvoidmain(Stringargs[])
{
Rabbitrabit;
rabit=newRabbit(0,null,0);//新建线程rabit
Tortoisetortoise;
tortoise=newTortoise(0,null,0);
tortoise.start();//启动线程tortoise
rabit.start();//启动线程rabit
}
}
2.1BankExample.java
classBankimplementsRunnable
{
intmoney=100;//声明一个int型变量money,初值为100
Threadzhang,keven;
Bank()
{
zhang=newThread(this);//创建zhang,Bank对象为zhang的目标对象
zhang.setName("会计");//设置zhang线程的名字为“会计”
keven=newThread(this);//创建keven,Bank对象为keven的目标对象
keven.setName("出纳");//设置keven线程的名字为“出纳”
}
publicvoidrun()
{
inti=0;//声明一个int类型变量i,初值为0
while(true)
{
if(zhang.isAlive())//判断线程zhang是否正在占有CPU资源
{
i=i+1;
money=money+1;
System.out.print(zhang.getName()+"将money的值改为"+money+"\n");
System.out.print(zhang.getName()+"的局部变量i="+i+"\n");
if(i>5)
{
System.out.print(zhang.getName()+"线程进入死亡状态\n");
zhang.stop();//使得线程zhang进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedExceptione)
{
}
}
elseif(keven.isAlive())//判断线程keven是否正在占有CPU资源
{
i=i-1;
money=money-1;
System.out.print(keven.getName()+"将money的值改为"+money+"\n");
System.out.print(keven.getName()+"的局部变量i="+i+"\n");
if(i<=-6)
{
System.out.print(keven.getName()+"线程进入死亡状态\n");
keven.stop();//使得线程keven进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedExceptione)
{
}
}
}
}
}
classBankExample
{
publicstaticvoidmain(Stringargs[])
{
Bankbank=newBank();
bank.zhang.start();
bank.keven.start();
}
}
2.2BankExample2.java
classBankimplementsRunnable
{
intmoney=100;//声明一个int型变量money,初值为100
Threadzhang,keven;
Bank()
{
zhang=newThread(this);//创建zhang,Bank对象为zhang的目标对象
zhang.setName("会计");//设置zhang线程的名字为“会计”
keven=newThread(this);//创建keven,Bank对象为keven的目标对象
keven.setName("出纳");//设置keven线程的名字为“出纳”
}
publicsynchronizedvoidrun()
{
inti=0;//声明一个int类型变量i,初值为0
while(true)
{
if(zhang.isAlive())//判断线程zhang是否正在占有CPU资源
{
i=i+1;
money=money+1;
System.out.print(zhang.getName()+"将money的值改为"+money+"\n");
System.out.print(zhang.getName()+"的局部变量i="+i+"\n");
if(i>=6)
{
System.out.print(zhang.getName()+"线程进入死亡状态\n");
zhang.stop();//使得线程zhang进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedExceptione)
{
}
}
elseif(keven.isAlive())//判断线程keven是否正在占有CPU资源
{
i=i-1;
money=money-1;
System.out.print(keven.getName()+"将money的值改为"+money+"\n");
System.out.print(keven.getName()+"的局部变量i="+i+"\n");
if(i<=-6)
{
System.out.print(keven.getName()+"线程进入死亡状态\n");
keven.stop();//使得线程keven进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedExceptione)
{
}
}
}
}
}
classBankExample2
{
publicstaticvoidmain(Stringargs[])
{
Bankbank=newBank();
bank.zhang.start();
bank.keven.start();
}
}
实验结论和总结:
实验第二部分,输出值有问题,限制条件为>=6,但是运行中money值一直给到110,远超过循环要实现的值,处理多线程时,当两个或多个线程同时访问同一个变量并且一个线程需要修改这个变量,可以讲一个方法用synchronized修饰,这样该方法在一个线程适合使用他时,别的线程就必须等待直到前一个使用完。
在我的实验中,在cmd中运行有如下提示,但能正常运行。
、
在网上查找后认为这应该是我使用Stop()方法引起的。
并且同时发现老师给出模板里都是使用“System.out.printf(getName()+"进入死亡状态\n")”,但我在自己使用的电脑不是和教材配套的JRE和JDK,没次把模板复制过去,这些显示iyuju都无法通过,必须改成System.out.print("进入死亡状态"+getName()+"\n")此类语句形式,也是由于Eclipse的版本问题引起的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告