Java 多线程抢票模拟:限制黄牛党抢票数量
以下是一个使用Java编程实现上述需求的示例代码:\n\njava\nimport java.util.concurrent.atomic.AtomicInteger;\n\nclass Ticket {\n private AtomicInteger remainingTickets = new AtomicInteger(10);\n\n public int getRemainingTickets() {\n return remainingTickets.get();\n }\n\n public synchronized void sellTicket(String buyer) {\n if (remainingTickets.get() > 0) {\n if (buyer.equals("黄牛党") && remainingTickets.get() == 9) {\n System.out.println("黄牛党只能抢一张票");\n } else {\n remainingTickets.decrementAndGet();\n System.out.println(buyer + "抢到了一张票,剩余票数:" + remainingTickets.get());\n }\n } else {\n System.out.println("票已售罄");\n }\n }\n}\n\npublic class Main {\n public static void main(String[] args) {\n Ticket ticket = new Ticket();\n\n Thread t1 = new Thread(() -> ticket.sellTicket("买家A"));\n Thread t2 = new Thread(() -> ticket.sellTicket("买家B"));\n Thread t3 = new Thread(() -> ticket.sellTicket("买家C"));\n Thread t4 = new Thread(() -> ticket.sellTicket("买家D"));\n Thread t5 = new Thread(() -> ticket.sellTicket("买家E"));\n Thread t6 = new Thread(() -> ticket.sellTicket("黄牛党"));\n\n t1.start();\n t2.start();\n t3.start();\n t4.start();\n t5.start();\n t6.start();\n\n try {\n t1.join();\n t2.join();\n t3.join();\n t4.join();\n t5.join();\n t6.join();\n } catch (InterruptedException e) {\n e.printStackTrace();\n }\n\n System.out.println("抢票结束,剩余票数:" + ticket.getRemainingTickets());\n }\n}\n\n\n运行以上代码,可以模拟多个买家同时抢票的情况,黄牛党只能抢一张票。输出结果如下:\n\n\n买家A抢到了一张票,剩余票数:9\n买家B抢到了一张票,剩余票数:8\n买家C抢到了一张票,剩余票数:7\n买家D抢到了一张票,剩余票数:6\n买家E抢到了一张票,剩余票数:5\n黄牛党只能抢一张票\n抢票结束,剩余票数:4\n\n\n注意:为了确保多个线程对剩余票数的操作安全,我们使用了synchronized关键字来保证在同一时间只有一个线程可以进入sellTicket方法。此外,我们使用了AtomicInteger来保证剩余票数的原子性操作。
原文地址: https://www.cveoy.top/t/topic/pP98 著作权归作者所有。请勿转载和采集!