Java多线程-简单例子(门票售卖)

2018-12-05  本文已影响0人  Liuzz25

前言:多个售票点同时售卖门票,通过多线程同步锁实现同步售票。

1.创建JavaProject。

项目结构图

2.编写Ticket类。

/**
 * <p>Title: Ticket</p>
 * <p>Description:门票类 </p>
 * @author Org
 * @version 1.0
 */
public class Ticket {
    
    // 票数余量
    private int restNum;

    public int getRestNum() {
        return restNum;
    }

    public void setRestNum(int restNum) {
        this.restNum = restNum;
    }

    // 门票类构造函数
    public Ticket(int restNum) {
        super();
        this.restNum = restNum;
    }
    
}

3.编写TicketThread类。

/**
 * <p>Title: TicketThread</p>
 * <p>Description:门票线程类</p>
 * @author Org
 * @version 1.0
 */
public class TicketThread extends Thread {
    
    // 售票点名称
    private String wicketName;
    // 门票类
    private Ticket ticket;
    // 票数余量
    private int count;

    // 线程构造函数
    public TicketThread(String wicketName, Ticket ticket) {
        this.wicketName = wicketName;
        this.ticket = ticket;
        count = ticket.getRestNum();
    }

    @Override
    public void run() {
        for(int i = 1; i <= count; i++){
            try{
                //同步锁
                synchronized (ticket) {
                    if(ticket.getRestNum() > 0){
                        ticket.setRestNum(ticket.getRestNum() - 1);
                        Thread.sleep(100);
                        System.out.println(wicketName + " 合计卖出 :" + i + " 张门票" + ", 剩余:" + ticket.getRestNum() + " 张门票");
                    }else{
                        System.out.println(wicketName + " 门票抢光啦 ~");
                        break;
                    }
                }
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

4.编写测试Test类

/**
 * 
 * <p>Title: Test</p>
 * <p>Description: 测试类</p>
 * @author Org
 * @version 1.0
 */
public class Test {
    
    public static void main(String[] args) {
        
        // 设置票数总量为25
        Ticket ticket = new Ticket(25);

        // 创建3个线程
        TicketThread wicket1 = new TicketThread("1号售票口", ticket);
        TicketThread wicket2 = new TicketThread("2号售票口", ticket);
        TicketThread wicket3 = new TicketThread("3号售票口", ticket);
        TicketThread wicket4 = new TicketThread("4号售票口", ticket);

        // 启动线程
        wicket1.start();
        wicket2.start();
        wicket3.start();
        wicket4.start();
        
    }
}

5.运行结果

运行结果图
上一篇 下一篇

猜你喜欢

热点阅读