Java中的异步票务队列

Java中的异步票务队列,java,asynchronous,concurrency,queue,java.util.concurrent,Java,Asynchronous,Concurrency,Queue,Java.util.concurrent,我想创建一个票务服务,就像人们在银行找到的那样。当轮到票的时候,它会像往常一样执行一些代码。我的特殊情况是,当代码被执行时,过程并不总是完成;它可能立即完成,也可能在将来某个时候完成(在新的线程下)。因此,通常的方法“将所有内容放入队列中,当代码退出时,调用下一张票据”是不适用的 我在Java的API中查看了是否有什么可以做的事情(可能是通过未来的),但是我找不到任何合适的,或者我缺少了一些东西。因此,我创建了自己的版本,如下所示。你有更好的方法吗 此外,我还担心如果没有调用next()(特别是

我想创建一个票务服务,就像人们在银行找到的那样。当轮到票的时候,它会像往常一样执行一些代码。我的特殊情况是,当代码被执行时,过程并不总是完成;它可能立即完成,也可能在将来某个时候完成(在新的
线程下)。因此,通常的方法“将所有内容放入队列中,当代码退出时,调用下一张票据”是不适用的

我在Java的API中查看了是否有什么可以做的事情(可能是通过
未来的
),但是我找不到任何合适的,或者我缺少了一些东西。因此,我创建了自己的版本,如下所示。你有更好的方法吗

此外,我还担心如果没有调用
next()
(特别是发生
异常时)。有可能保护这一点吗

这是我的密码:

公共类票务服务{
private final Queue=new LinkedList();
最后一张私家票;
公共同步作废添加(使用者可运行){
票证=新票证(可运行);
if(last==null){
最后一张=票;
票证。开始();
}否则
排队。添加(票);
}
私人同步作废下一张票(旧票){
如果(最后一张!=旧票)
抛出新的运行时异常(“无效票证”);
last=queue.poll();
if(last!=null)
last.start();
}
公务舱票{
私人最终用户可运行;
私人车票(消费者可运行){
this.runnable=runnable;
}
私有void start(){
接受(这个);
}
下一个公共空间(){
nextTicket(本);
}
}
}
下面是一些测试代码:

private static TicketingService tickets=new TicketingService();
私有静态AtomicLong gen=新的AtomicLong(0);
公共静态void main(字符串[]args){
对于(int i=0;i<1000;i++)
加(i);
}
公共静态无效添加(长v){
门票。添加(t->{
新线程(()->{
if(Math.random()>0.5)
添加(gen.addAndGet(-1));
系统输出打印项次(“终止”+v);
t、 next();
}).start();
});
}