package com.neutron.t21;
import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.TimeUnit;
/**
* 有N张火车票,每张票都有1个编号,同时有10个窗口对外售票
*
* 需要了解并发容器:ConcurrentLinkedDeque
* Ticket5相比前4个效率最好
*/
public class Ticket5 {
static Queue<String> tickets = new ConcurrentLinkedDeque<>();
static {
for (int i = 0; i < 1000; i++) {
tickets.add("No:" + i);
}
}
/**
* 1.创建队列tickets
* 2.在static中将10000中票放到队列中
* 3.创建10个线程进行售票
* 4.poll方法是同步方式
* 5.poll获取不到数据返回的是null
*
* 现在的判断和操作没有上锁,为什么不会有问题呢?
* 现在是先操作后判断,之前先判断后操作,哪怕在操作后被打断去判断没问题
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
while (true) {
String ticket = tickets.poll();
if (Objects.isNull(ticket)) {
break;
} else {
System.out.println("sell ticket:" + ticket);
}
}
}).start();
}
}
}
thread35 - 售票5
最新推荐文章于 2022-10-19 14:50:23 发布