思路
Ticket类(车票)
private Integer ticketNum; //票号
private String trainNum; //车次
private String Origin; //始发地
private String destination; //目的地
Ticketer子线程类(售票员)
private List
//卖票方法(从集合中删除一张票)
public void sellingTickets(){
从票库删除一张票
}
重写Thread线程类的run方法
实现多线程卖票,“卖完为止”
//如果剩余有票,则调用卖票方法
//否则,票已售完
测试类中创建两个子线程进行卖票
public class Test {
public static void main(String[] args) {
//票库
List
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号票小汪汪 票已售完 票已售完



