package hello;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//文件起名的时候就叫ThreadTicket,叫个售票窗口可能更形象,票面简化为直达某地
public class ThreadTicket extends Thread{
String buyer;
ArrayList<String> ticketList;
public String getBuyer() {
return buyer;
}
public void setBuyer(String buyer) {
this.buyer = buyer;
}
public ArrayList<String> getTicketList() {
return ticketList;
}
public void setTicketList(ArrayList<String> ticketList) {
this.ticketList = ticketList;
}
//上锁简化,这里这可有其它关键字或更复杂的技术手段应对实际场景
public void sale() {
synchronized (ThreadTicket.class) {
if(ticketList.size()>0) {
System.out.println(buyer+":"+ticketList.get(0));
ticketList.remove(0);
}
}
//抢票效果叫最后说明
// if(ticketList.size()>0) {
// System.out.println(buyer+":"+ticketList.get(0));
// ticketList.remove(0);
// }
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
this.sale();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> userList=Arrays.asList("smith","john","lisa","sarah","tom","phil");
ArrayList<String> ticketList=new ArrayList<String>();
ticketList.add("北京");
ticketList.add("上海");
ticketList.add("廊坊");
ticketList.add("沧州");
ticketList.add("石家庄");
ticketList.add("秦皇岛");
Thread[] threads=new Thread[6];
for(int i=0;i<threads.length;i++) {
ThreadTicket thread=new ThreadTicket();
thread.setBuyer(userList.get(i));
thread.setTicketList(ticketList);
threads[i]=new Thread(thread);
//优先级效果不明显
// if(i==4) {
// threads[i].setPriority(10);
// }
threads[i].start();
//sleep代表强制排队,这里可以采用其它技术手段
// try {
// threads[i].sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
}
最后抢票出现的意外问题:
smith:北京
lisa:上海
sarah:廊坊
john:沧州
tom:石家庄
phil:秦皇岛
排队顺序被打乱
smith:北京
john:上海
tom:廊坊
lisa:廊坊
phil:石家庄
sarah:秦皇岛
卖完的票未来及删除
smith:北京
lisa:上海
john:北京
sarah:沧州
tom:石家庄
phil:秦皇岛
即有加塞还有重票完全乱掉
同步以后
john:北京
phil:上海
smith:廊坊
tom:沧州
sarah:石家庄
lisa:秦皇岛
未解决插队的问题
smith:北京
sarah:北京
john:北京
tom:上海
lisa:石家庄
phil:秦皇岛
有重票
-------------
john:北京
phil:上海
smith:廊坊
tom:沧州
sarah:石家庄
lisa:秦皇岛
无重票但有加塞情况
---------------
john:北京
sarah:上海
phil:廊坊
smith:北京
lisa:廊坊
tom:石家庄
仍未解决
——————
smith:北京
john:上海
lisa:廊坊
sarah:沧州
tom:石家庄
phil:秦皇岛
sleep仅代表强制按照排队顺序依次购买,未考虑业务场景