java多线程卖票案例(阻塞队列(ArrayBlockingQueue))
题目需求: 代码实现火车站3个窗口同时卖25张车票的逻辑,同一个窗口不能卖同一张票
public class Window {
public Window(String name) {
this.name = name;
}
public Window() {
}
// 私有的当前票
public static Ticket ticket;
// 窗口名
private String name;
static Queue<Ticket> queue = null;
static {
queue = new ArrayBlockingQueue<Ticket>(25);
for (int i = 0; i < 25; i++) {
queue.add(new Ticket("票" + i));
}
}
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Thread(() -> {
while (true) {
Ticket poll = Window.queue.poll();
if (null == poll) {
System.out.println(Thread.currentThread().getName()+"拿票失败");
break;
}
System.out.println(Thread.currentThread().getName()+" 拿到了票: "+poll.getTag());
}
}, "窗口" + i).start();
}
}
}
// 票对象
class Ticket {
private String tag;
@Override
public String toString() {
return "Ticket{" +
"tag='" + tag + '\'' +
'}';
}
public Ticket(String tag) {
this.tag = tag;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Ticket ticket = (Ticket) o;
return Objects.equals(tag, ticket.tag);
}
@Override
public int hashCode() {
return Objects.hash(tag);
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
}
运行结果:
主要用到了阻塞队列来实现