栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

火车卖票,多线程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

火车卖票,多线程

思路

Ticket类(车票)
    private Integer ticketNum; //票号
    private String trainNum; //车次
    private String Origin; //始发地
    private String destination; //目的地


Ticketer子线程类(售票员)
    private List tickets; //票库(多个售票员同一个票库)

    //卖票方法(从集合中删除一张票)
    public void sellingTickets(){
        从票库删除一张票
    }

    重写Thread线程类的run方法
        实现多线程卖票,“卖完为止”
        //如果剩余有票,则调用卖票方法
        //否则,票已售完
        

测试类中创建两个子线程进行卖票
public class Test {
    public static void main(String[] args) {
        //票库
        List tickets = new ArrayList<>();
        for (int i = 1; i <= 20 ; i++) {
            Ticket ticket = new Ticket(i,"G2022","郑州","重庆");
            tickets.add(ticket);
        }

        Ticketer t1 = new Ticketer();
        t1.setName("小红");
        Ticketer t2 = new Ticketer();
        t2.setName("小丽");
        //给两个售票员设置同一个票库
        t1.setTickets(tickets);
        t2.setTickets(tickets);

        //开始子线程进行售票
        t1.start();
        t2.start();
    }
}
Ticket

package cn.ds.baidu.demo19.zuo;

public class Ticket {
    private Integer ticketNum; //票号
    private String trainNum; //车次
    private String Origin; //始发地
    private String destination; //目的地

    public Ticket() {
    }

    public Ticket(Integer ticketNum, String trainNum, String origin, String destination) {
        this.ticketNum = ticketNum;
        this.trainNum = trainNum;
        Origin = origin;
        this.destination = destination;
    }

    @Override
    public String toString() {
        return "Ticket{" +
                "ticketNum=" + ticketNum +
                ", trainNum='" + trainNum + ''' +
                ", Origin='" + Origin + ''' +
                ", destination='" + destination + ''' +
                '}';
    }

    public Integer getTicketNum() {
        return ticketNum;
    }

    public void setTicketNum(Integer ticketNum) {
        this.ticketNum = ticketNum;
    }

    public String getTrainNum() {
        return trainNum;
    }

    public void setTrainNum(String trainNum) {
        this.trainNum = trainNum;
    }

    public String getOrigin() {
        return Origin;
    }

    public void setOrigin(String origin) {
        Origin = origin;
    }

    public String getDestination() {
        return destination;
    }

    public void setDestination(String destination) {
        this.destination = destination;
    }
}

Ticketer

package cn.ds.baidu.demo19.zuo;

import java.util.List;

public class Ticketer  extends Thread{
    private List tickets;//票库(多个售票员同一个票库)

    public List getTickets() {
        return tickets;
    }

    public void setTickets(List tickets) {
        this.tickets = tickets;
    }

    //卖票方法(从集合中删除一张票)
    //从票库删除一张票
    static Object object = new Object();
    public void sellingTickets(Object obj){
        for(int i = 0;i < tickets.size(); i++){
            if (obj == tickets.get(i))
            {
                tickets.remove(obj);
            }
        }

    }

    //实现多线程卖票,“卖完为止”
    //如果剩余有票,则调用卖票方法
    //否则,票已售完
    @Override
    public void run() {
        int i = tickets.size();
        try {
            while (true){
                //线程休眠
                Thread.sleep(1000);
                //线程同步
                synchronized (object){
                    if (i > 0){
                        sellingTickets(i);
                        System.out.println("卖出的是" + i + "号票" + Thread.currentThread().getName());
                        i--;
                    }else {
                        System.out.println("票已售完");
                        break;
                    }
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Test

package cn.ds.baidu.demo19.zuo;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        Ticketer tr = new Ticketer();
        //票库
        List tickets = new ArrayList<>();
        for (int i = 1; i <= 20 ; i++) {
            Ticket ticket = new Ticket(i,"G2022","郑州","重庆");
            tickets.add(ticket);
        }

        Ticketer t1 = new Ticketer();
        t1.setName("小美");
        Ticketer t2 = new Ticketer();
        t2.setName("小汪汪");
        //给两个售票员设置同一个票库
        t1.setTickets(tickets);
        t2.setTickets(tickets);

        //开始子线程进行售票
        t1.start();
        t2.start();
    }
}
卖出的是20号票小汪汪
卖出的是20号票小美
卖出的是19号票小美
卖出的是19号票小汪汪
卖出的是18号票小美
卖出的是18号票小汪汪
卖出的是17号票小汪汪
卖出的是17号票小美
卖出的是16号票小汪汪
卖出的是16号票小美
卖出的是15号票小汪汪
卖出的是15号票小美
卖出的是14号票小美
卖出的是14号票小汪汪
卖出的是13号票小汪汪
卖出的是13号票小美
卖出的是12号票小美
卖出的是12号票小汪汪
卖出的是11号票小美
卖出的是11号票小汪汪
卖出的是10号票小美
卖出的是10号票小汪汪
卖出的是9号票小美
卖出的是9号票小汪汪
卖出的是8号票小美
卖出的是8号票小汪汪
卖出的是7号票小美
卖出的是7号票小汪汪
卖出的是6号票小汪汪
卖出的是6号票小美
卖出的是5号票小美
卖出的是5号票小汪汪
卖出的是4号票小汪汪
卖出的是4号票小美
卖出的是3号票小汪汪
卖出的是3号票小美
卖出的是2号票小汪汪
卖出的是2号票小美
卖出的是1号票小美
卖出的是1号票小汪汪
票已售完
票已售完

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号