请用Java的juc包的FixedThreadPool写一段模拟买票的代码并且利用synchronized 关键字保证线程的安全性
以下是使用Java的juc包中的FixedThreadPool实现的模拟买票的代码,并利用synchronized关键字保证线程的安全性:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TicketCounter {
private int availableTickets = 100; // 假设一共有100张票
public synchronized void sellTicket(int num) {
if (availableTickets >= num) {
availableTickets -= num;
System.out.println(Thread.currentThread().getName() + " 卖出 " + num + " 张票,剩余 " + availableTickets + " 张票");
} else {
System.out.println(Thread.currentThread().getName() + " 剩余票数不足,无法卖出");
}
}
public static void main(String[] args) {
TicketCounter ticketCounter = new TicketCounter();
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
executorService.execute(() -> {
ticketCounter.sellTicket(1);
});
}
executorService.shutdown();
}
}
在上述代码中,我们创建了一个TicketCounter类,它有一个availableTickets变量表示剩余的票数。sellTicket方法使用synchronized关键字修饰,以保证在同一时刻只有一个线程可以访问该方法。如果剩余票数足够,线程会卖出指定数量的票,并输出剩余的票数;否则输出剩余票数不足的提示。
在main方法中,我们创建了一个FixedThreadPool,容量为3,然后循环提交10个任务,每个任务调用TicketCounter的sellTicket方法卖出1张票。最后调用executorService的shutdown方法关闭线程池。
这样,通过使用FixedThreadPool和synchronized关键字,我们实现了多线程模拟买票,并保证了线程的安全性
原文地址: https://www.cveoy.top/t/topic/iwQB 著作权归作者所有。请勿转载和采集!