问题描述
我想创建一种票务服务,就像人们在银行找到的那样。当轮到票时,它会像往常一样执行一些代码。我的特殊情况是,当代码执行时,程序不会总是完成;它可能立即完成,也可能在未来某个时间完成(在新的 Thread
下)。因此,通常的方法“将所有内容放入队列,当代码退出时,调用下一张票”是不适用的。
我查看了 Java 的 API,看看有没有可以做的事情(可能是 Future
的?),但我找不到任何合适的东西,或者我遗漏了一些东西。出于这个原因,我创建了自己的版本,如下所示。你有什么更好的方法吗?
另外,我担心如果 next()
没有被调用(尤其是 Exception
发生时)会怎样。有可能保护这一点吗?
这是我的代码:
public class TicketingService {
private final Queue<Ticket> queue = new LinkedList<>();
private Ticket last;
public synchronized void add(Consumer<Ticket> runnable) {
Ticket ticket = new Ticket(runnable);
if (last == null) {
last = ticket;
ticket.start();
} else
queue.add(ticket);
}
private synchronized void nextTicket(Ticket oldTicket) {
if (last != oldTicket)
throw new RuntimeException("Invalid ticket");
last = queue.poll();
if (last != null)
last.start();
}
public class Ticket {
private final Consumer<Ticket> runnable;
private Ticket(Consumer<Ticket> runnable) {
this.runnable = runnable;
}
private void start() {
runnable.accept(this);
}
public void next() {
nextTicket(this);
}
}
}
这里是一些测试代码:
private static TicketingService tickets = new TicketingService();
private static AtomicLong gen = new AtomicLong(0);
public static void main(String[] args) {
for (int i = 0; i < 1000; i++)
add(i);
}
public static void add(long v) {
tickets.add(t -> {
new Thread(() -> {
if (Math.random() > 0.5)
add(gen.addAndGet(-1));
System.out.println("Terminating " + v);
t.next();
}).start();
});
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)