北 京 林 业 大 学
2013 学年— 20## 学年第 2学期 Java程序设计基础实验报告书
专 业: 电子 班 级: 11-2
姓 名: 王云飞 学 号: 101114110
实验地点: 计算机中心 任课教师: 黄儒乐
实验题目:多线程的使用
实验环境: Windows2000/XP;局域网
实验要求:
1. 对所有实验内容中涉及到的命令均要亲自实践,对照实验指导书进行。
2. 把实验中出现的问题以及最后解决的情况反馈到实验报告中。
3. 程序作业的源代码要求反馈到实验报告中。
实验内容:
1.线程的状态
按模板要求,将【代码1】~【代码10】替换为Java程序代码。
ThreadExample.java
class Tortoise extends Thread
{
int sleepTime=0,liveLength=0;
Tortoise(int sleepTime,String name,int liveLength)
{
this.sleepTime=sleepTime;
this.liveLength=liveLength;
【代码1】 // 设置线程的名字为name
}
public void run()
{
while(true)
{
liveLength--;
System.out.printf("@");
try
{
【代码2】 // 让线程调用 sleep方法进入中断状态,sleepTime毫秒后线程
// 重新排队,等待CPU资源
}
catch(InterruptedException e)
{
}
if(liveLength<=0)
{
System.out.printf(getName()+"进入死亡状态\n");
【代码3】 // 结束run方法的语句
}
}
}
}
class Rabbit extends Thread
{
int sleepTime=0,liveLength;
Rabbit(int sleepTime,String name,int liveLength)
{
this.sleepTime=sleepTime;
this.liveLength=liveLength;
【代码4】 // 设置线程的名字为name
}
public void run()
{
while(true)
{
liveLength--;
System.out.printf("*");
try
{
【代码5】 // 让线程调用 sleep方法进入中断状态,sleepTime毫秒后
// 线程重新排队,等待CPU资源
}
catch(InterruptedException e)
{
}
if(liveLength<=0)
{
System.out.printf(getName()+"进入死亡状态\n");
【代码6】 // 结束run方法的语句
}
}
}
}
public class ThreadExample
{
public static void main(String args[ ])
{
Rabbit rabit;
rabit=【代码7】 // 新建线程rabit
Tortoise tortoise;
tortoise=【代码8】 // 新建线程tortoise
【代码9】 // 启动线程tortoise
【代码10】 // 启动线程rabit
}
}
2.使用Runnable方法
按模板要求,将【代码1】~【代码10】替换为Java程序代码。
BankExample.java
class Bank implements Runnable
{
【代码1】 // 声明一个int型变量money,初值为100
Thread zhang,keven;
Bank()
{
【代码2】 // 创建zhang,Bank对象为zhang的目标对象
【代码3】 // 设置zhang线程的名字为“会计”
【代码4】 // 创建keven,Bank对象为keven的目标对象
【代码5】 // 设置keven线程的名字为“出纳”
}
public void run()
{
【代码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(InterruptedException e)
{
}
}
else if(【代码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(InterruptedException e)
{
}
}
}
}
}
class BankExample
{
public static void main(String args[ ])
{
Bank bank=new Bank();
bank.zhang.start();
bank.keven.start();
}
}
3. 线程同步实验
分析上面BankExample的输出,是否发现money数据输出有误,请将针对money值得操作写成一个同步方法,解决上述问题。
实验目的:
掌握两种线程创建的方法,掌握线程控制的基本方法。
实现方法、实验结果及结论分析等:
实验内容1源代码:
class Tortoise extends Thread
{
int sleepTime=0,liveLength=0;
Tortoise(int sleepTime,String name,int liveLength)
{
this.sleepTime=sleepTime;
this.liveLength=liveLength;
setName(name); // 设置线程的名字为name
}
public void run()
{
while(true)
{
liveLength--;
System.out.printf("@");
try
{
Thread.sleep(sleepTime); // 让线程调用 sleep方法进入中断状态,sleepTime毫秒后线程
// 重新排队,等待CPU资源
}
catch(InterruptedException e)
{
}
if(liveLength<=0)
{
System.out.printf(getName()+"进入死亡状态\n");
return; // 结束run方法的语句
}
}
}
}
class Rabbit extends Thread
{
int sleepTime=0,liveLength;
Rabbit(int sleepTime,String name,int liveLength)
{
this.sleepTime=sleepTime;
this.liveLength=liveLength;
setName(name); // 设置线程的名字为name
}
public void run()
{
while(true)
{
liveLength--;
System.out.printf("*");
try
{
sleep(sleepTime); // 让线程调用 sleep方法进入中断状态,sleepTime毫秒后
// 线程重新排队,等待CPU资源
}
catch(InterruptedException e)
{
}
if(liveLength<=0)
{
System.out.printf(getName()+"进入死亡状态\n");
return; // 结束run方法的语句
}
}
}
}
public class ThreadExample
{
public static void main(String args[ ])
{
Rabbit rabit;
rabit = new Rabbit(3000,"tuzi",5); // 新建线程rabit
Tortoise tortoise;
tortoise = new Tortoise(1000,"wangba",4); // 新建线程tortoise
tortoise.start(); // 启动线程tortoise
rabit.start(); // 启动线程rabit
}
}
实验结果:
实验内容2源代码
class Bank implements Runnable
{
int money = 100; // 声明一个int型变量money,初值为100
Thread zhang,keven;
Bank()
{
zhang = new Thread(this); // 创建zhang,Bank对象为zhang的目标对象
zhang.setName("会计"); // 设置zhang线程的名字为“会计”
keven=new Thread(this); // 创建keven,Bank对象为keven的目标对象
keven.setName("出纳"); // 设置keven线程的名字为“出纳”
}
public void run()
{
int i = 0; // 声明一个int类型变量i,初值为0
while(true)
{
if(zhang.isAlive()) // 判断线程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());
zhang.stop(); // 使得线程zhang进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
}
}
else if(keven.isAlive()) // 判断线程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());
keven.stop(); // 使得线程keven进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
}
}
}
}
}
class BankExample
{
public static void main(String args[ ])
{
Bank bank=new Bank();
bank.zhang.start();
bank.keven.start();
}
}
实验结果:
实验内容3源代码:
class Bank implements Runnable
{
int money = 100; // 声明一个int型变量money,初值为100
Thread zhang,keven;
Bank()
{
zhang = new Thread(this); // 创建zhang,Bank对象为zhang的目标对象
zhang.setName("会计"); // 设置zhang线程的名字为“会计”
keven=new Thread(this); // 创建keven,Bank对象为keven的目标对象
keven.setName("出纳"); // 设置keven线程的名字为“出纳”
}
public synchronized void run()
{
int i = 0; // 声明一个int类型变量i,初值为0
while(true)
{
if(zhang.isAlive()) // 判断线程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());
zhang.stop(); // 使得线程zhang进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
}
}
else if(keven.isAlive()) // 判断线程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());
keven.stop(); // 使得线程keven进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
}
}
}
}
}
class BankExampleUseSynchronizedMethod{
public static void main(String args[ ])
{
Bank bank=new Bank();
bank.zhang.start();
bank.keven.start();
}
}
实验结果: