Java 中的异步票务队列

问题描述

我想创建一种票务服务,就像人们在银行找到的那样。当轮到票时,它会像往常一样执行一些代码。我的特殊情况是,当代码执行时,程序不会总是完成;它可能立即完成,也可能在未来某个时间完成(在新的 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 (将#修改为@)