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.运行结果
运行结果图