一、实验目的:
1.掌握使用Thread子类和Runnable接口创建多线程的方法。
2.掌握线程的执行过程。
- 实验内容
1(题目编号7179)、利用多线程技术编写一个模拟龟兔赛跑的程序,要求如下:(1)乌龟每次跑一个单位,兔子每次跑10个单位;(2)每个线程运行时,判断是否达到终点,如果到达终点,给出提示信息,未到终点则提示目前距离终点的距离,并判断是否领先;(3)如果兔子领先,则显示“我跑得快,睡一觉”信息,并睡一会。
class Run implements Runnable {
int total = 100;
int ts = 0;//turtle
int rs = 0;//rabbit
public void run() {
while (true) {
String name = Thread.currentThread().getName();
if (name.equals("乌龟")){
ts = ts+1;
if(ts == total){
System.out.println("乌龟到了");
return;
}else{
System.out.println("乌龟距离还有"+(total-ts));
if(ts>rs){
System.out.println("乌龟领先");
}else if(ts<rs){
System.out.println("兔子领先");
}else{
System.out.println("两只一样");
}
}
}
else{
rs=rs+10;
if(rs==total){
System.out.println("兔子到了");
return;
}else{
System.out.println("兔子距离还有"+(total-rs));
if(ts>rs){
System.out.println("乌龟领先");
}else if(ts<rs){
System.out.println("兔子领先");
System.out.println("我累了睡一会儿");
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("两只一样");
}
}
}
}
}
}
public class shiyan777 {
public static void main(String args[]){
//Run r = new Run();
//Run t = new Run();
//Thread ra = new Thread(r);
//Thread tr = new Thread(t);
Run r =new Run();
Thread tr=new Thread(r);
Thread ra=new Thread(r);
ra.setName("兔子");
tr.setName("乌龟");
ra.start();
tr.start();
}
}
2(题目编号7182)、用实现Runnable接口的方式实现两个火车站共同售票。假设哈站和哈西两个车站共有100张车票,编写程序实现两个车站同时售票。观察程序运行情况?找到存在的问题及解决办法。
public class shiyan7_1 {
public static void main(String arg[]){
Ticket ticket=new Ticket();
Thread hx=new Thread(ticket);
Thread hz=new Thread(ticket);
hx.setName("哈西");
hz.setName("哈站");
hx.start();
hz.start();
}
}
class Ticket implements Runnable {
volatile static int num=100;
public void run(){
String name=Thread.currentThread().getName();
while(true){
if(name.equals("哈西")){
Ticket.sale();
if (num<=0){
break;
}
}
else {
Ticket.sale();
if (num <= 0) {
break;
}
}
try {
Thread.sleep(2);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public static synchronized void sale(){
if(num<=0){
System.out.println("票卖完了");
return;
}
String name=Thread.currentThread().getName();
if(name.equals("哈西")){
num-=1;
System.out.println("哈西卖出一张票");
}
else{
num-=1;
System.out.println("哈站卖出一张票");
}
System.out.println("还有"+num+"张票");
}
}
下面这个需要卖1000张才能看到交替
public class shiyan7_22 {
public static void main(String[] args) {
Tick t = new Tick();
t.setTick(100);
Thread hx = new Thread(t);
Thread hz = new Thread(t);
hx.setName("哈西");
hz.setName("哈站");
hx.start();
hz.start();
}
private static class Tick implements Runnable {
private int ticketAmount;
private volatile boolean soldOut;
public void setTick(int amount) {
ticketAmount = amount;
soldOut = false;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
while (true) {
synchronized (this) {
if (soldOut) {
break;
}
if (ticketAmount > 0) {
if (name.equals("哈西")) {
System.out.println("哈西卖出一张票");
} else if (name.equals("哈站")) {
System.out.println("哈站卖出一张票");
}
ticketAmount--;
System.out.println("剩余" + ticketAmount);
} else {
soldOut = true;
System.out.println("票卖完了");
}
}
}
}
}
}
三、实验结果与分析:
实验错误1:在1中主方法中错建立了两个线程,导致兔子一直觉得自己领先。
注释是错的
public class shiyan777 {
public static void main(String args[]){
//Run r = new Run();
//Run t = new Run();
//Thread ra = new Thread(r);
//Thread tr = new Thread(t);
Run r =new Run();
Thread tr=new Thread(r);
Thread ra=new Thread(r);
ra.setName("兔子");
tr.setName("乌龟");
ra.start();
tr.start();
}
}