Java实验(7)多线程并发

一、实验目的
1.掌握使用Thread子类和Runnable接口创建多线程的方法。
2.掌握线程的执行过程。
二、实验内容及代码
1(题目编号7179)、利用多线程技术编写一个模拟龟兔赛跑的程序,要求如下:
(1)乌龟每次跑一个单位,兔子每次跑10个单位;
(2)每个线程运行时,判断是否达到终点,如果到达终点,给出提示信息,未到终点则提示目前距离终点的距离,并判断是否领先;
(3)如果兔子领先,则显示“我跑得快,睡一觉”信息,并睡一会。

public class No7179 extends Thread{
    private int distance=100;
    static int rubDistance=0;
    static int turDistance=0;
    static boolean flag= true;
    public void run(){
        String name= Thread.currentThread().getName();
        while(flag){
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }

            if(name.equals("兔子")){
                rubDistance=rubDistance+10;

                //兔子休息
                if(rubDistance>=turDistance&&rubDistance<distance){
                    System.out.println(name+"说:我还剩"+(distance-rubDistance)+"米!"+"我跑的快,先睡一觉。");
                    try{
                        Thread.sleep(500);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
                else {
                    System.out.println(name+"说:我还剩"+(distance-rubDistance)+"米!");
                }
                if(rubDistance==distance){
                    System.out.println(name+"达到了终点,比赛结束!");
                    flag=false;
                    break;
                }

                if(!flag){
                    System.out.println(name+"说:我输了! 早知道不睡了!");
                }
            }

            if(name.equals("乌龟")){
                turDistance=turDistance+1;
                if(!flag){
                    System.out.println(name+"说:我输了!");
                }else{
                    System.out.println(name+"说:我还剩"+(distance-turDistance)+"米!");
                }

                if(turDistance==distance&&flag){//兔子未到达终点
                    System.out.println(name+"达到了终点,比赛结束!");
                    flag=false;
                    break;
                }
            }
        }
    }
    public static void main(String[] args){
        No7179 rubbit=new No7179();
        rubbit.setName("兔子");
        No7179 turtle=new No7179();
        turtle.setName("乌龟");

        rubbit.start();
        turtle.start();
    }
}

测试:
在这里插入图片描述

2(题目编号8690)、编写多线程应用程序,模拟多人过独木桥的模拟。独木桥每次只能通过一个人,每个人通过木桥的时间为5秒,随机生成10个人,同时准备过此独木桥,显示一下每次通过独木桥人的姓名。需要用到随机数。

import  java.util.*;

class SingleBridge implements Runnable {
    @Override
    public void run() {
        synchronized(this) {//synchronized保证线程不被打断
            System.out.println(Thread.currentThread().getName() + " 开始过桥");
            try {
                Thread.sleep(5000);//过桥
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " 已过桥");
        }
    }
}
public class Main {
    static final int N = 10; // 人数
    public static void main(String[] args) throws InterruptedException {
        SingleBridge s = new SingleBridge();
        List<Thread> threads = new ArrayList<>();
        for(int i = 0; i < N; i++) {
            threads.add(new Thread(s, "name" + i));
        }
        Random random = new Random();
        while(threads.size() > 0) {
            int index = random.nextInt(threads.size());//随机抽人
            threads.get(index).start();
            threads.remove(index);
        }
    }
}

3、题目编号7180)、哈尔滨火车站下面有三个火车票代售点:哈站、哈东站、哈西站,假如哈尔滨到北京的火车票总共是200张,如何用程序来实现三个售票点同时卖票的功能。注意:考虑线程同步问题,避免出现重复卖票问题。需要考虑同步问题。
(200张票太多了,这里只测试20张)


class Ticket implements Runnable {
    static boolean flag=true;
    private int ticketCount = 20;// 总的票数,这个是共享资源,多个线程都会访问

    public void run() {
        while (flag)// 循环是指线程不停的去卖票
        {
            synchronized (this) {//锁线程
                if (ticketCount > 0) {
                    ticketCount--;
                    System.out.println(Thread.currentThread().getName() + "正在卖出一张票,还剩" + ticketCount + "张票");
                    if(ticketCount==0){
                        System.out.println("今天的票买光了!");
                        flag=false;//停止其他车站的卖票线程
                        break;
                    }
                }
            }

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}


public class Main {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        //建立三个卖票线程
        Thread haxi = new Thread(ticket);
        haxi.setName("哈西");

        Thread hadong = new Thread(ticket);
        hadong.setName("哈东");

        Thread hazhan = new Thread(ticket);
        hazhan.setName("哈站");

        haxi.start();
        hazhan.start();
        hadong.start();
    }
}

测试:
在这里插入图片描述
三、实验分析与讨论
Java中可以通过继承Thread类或者实现Runnable接口来实现多线程,在执行线程时应该要加入sleep()延时函数,避免一个线程一直霸占CPU。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小绵杨Yancy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值