使用Synchronize同步ticket对象,注意同步代码块要在while循环里面写。不然就会出现只有一个线程把票买完的情况。
Customer接口:
package 卖票; @FunctionalInterface public interface Customer { void buyTicket(); }
package 卖票; /** * 票 * @author Z7M-SL7D2 * */ public class Ticket { Integer ticketCount; public Integer getTicketCount() { return ticketCount; } public void setTicketCount(Integer ticketCount) { this.ticketCount = ticketCount; } public Ticket(Integer ticketCount) { super(); this.ticketCount = ticketCount; } }
测试类:
package 卖票; public class Test { public static void main(String[] args) { Ticket ticket = new Ticket(1000); Customer buy = ()-> { ticket.ticketCount--; }; Runnable buyAction = ()-> { while (true) { synchronized (ticket) { if (ticket.getTicketCount() <= 0) return; buy.buyTicket(); System.out.println(Thread.currentThread().getName() + "买去了一张,还剩下" + ticket.getTicketCount()); } } }; Thread customer1 = new Thread(buyAction, "消费者1"); Thread customer2 = new Thread(buyAction, "消费者2"); Thread customer3 = new Thread(buyAction, "消费者3"); Thread customer4 = new Thread(buyAction, "消费者4"); customer1.start(); customer2.start(); customer3.start(); customer4.start(); } }
运行结果: