实验报告实验四.docx

上传人:b****5 文档编号:6769078 上传时间:2023-01-10 格式:DOCX 页数:15 大小:57.79KB
下载 相关 举报
实验报告实验四.docx_第1页
第1页 / 共15页
实验报告实验四.docx_第2页
第2页 / 共15页
实验报告实验四.docx_第3页
第3页 / 共15页
实验报告实验四.docx_第4页
第4页 / 共15页
实验报告实验四.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实验报告实验四.docx

《实验报告实验四.docx》由会员分享,可在线阅读,更多相关《实验报告实验四.docx(15页珍藏版)》请在冰豆网上搜索。

实验报告实验四.docx

实验报告实验四

北京林业大学

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的版本问题引起的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1