{"title":"Java多线程编程:使用FixedThreadPool模拟售票系统","description":"本文通过Java的juc包中的FixedThreadPool实现了一个简单的售票系统,演示了如何使用线程池来管理多个售票窗口,并使用synchronized关键字确保售票过程的同步性,避免出现重复售票的情况。","keywords":"Java, 多线程, 线程池, FixedThreadPool, 售票系统, 同步, synchronized","content":"\u003ccode\u003eimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\n\npublic class TicketSeller {\n private static final int NUM_TICKETS = 100; // 总票数\n private static final int NUM_SELLERS = 5; // 售票窗口数\n\n public static void main(String[] args) {\n ExecutorService executorService = Executors.newFixedThreadPool(NUM_SELLERS);\n\n // 创建售票窗口\n for (int i = 0; i \u003c NUM_SELLERS; i++) {\n executorService.execute(new TicketSellerTask());\n }\n\n executorService.shutdown();\n }\n\n static class TicketSellerTask implements Runnable {\n private int ticketsSold = 0;\n\n @Override\n public void run() {\n while (true) {\n synchronized (TicketSellerTask.class) {\n // 判断是否还有票\n if (ticketsSold \u003c NUM_TICKETS) {\n System.out.println(Thread.currentThread().getName() + "卖出第" + (ticketsSold + 1) + "张票");\n ticketsSold++;\n } else {\n break;\n }\n }\n\n try {\n // 模拟售票过程中的耗时\n Thread.sleep(100);\n } catch (InterruptedException e) {\n e.printStackTrace();\n }\n }\n }\n }\n}\n\u003c/code\u003e\n\n在上面的代码中,我们使用了Executors.newFixedThreadPool(NUM_SELLERS)方法创建了一个固定大小的线程池,线程池中有NUM_SELLERS个线程,每个线程代表一个售票窗口。\n\n在TicketSellerTask类的run方法中,我们使用synchronized关键字对售票过程进行了同步操作,确保多个线程不会同时卖同一张票。每个线程通过自增变量ticketsSold来记录自己卖出的票数,当售出的票数达到总票数时,线程退出循环。\n\n在主程序中,我们创建了NUM_SELLERS个售票窗口,然后将每个窗口都提交给线程池进行执行。最后,我们调用executorService.shutdown()方法来关闭线程池。

Java多线程编程:使用FixedThreadPool模拟售票系统

原文地址: https://www.cveoy.top/t/topic/qeew 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录