实验七 多线程并发实验

一、实验目的:
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();
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值