分享成果,欢迎指正。
package com.gannalyo.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// /**
// * 经典多线程卖票
// *
// * 1.共20张票
// * 2.共5个窗口同时售票
// * 3.由于多个窗口操作的都是卖票,所以仅实现一个任务即可
// * 任务中通过while循环不断卖票,直到卖完为止,卖票操作同一时间只能被一个线程操作,故需加同步关键字,
// * 4.开启5个线程同时执行卖票任务
// *
// * @author Gannalyo
// */
public class 多线程卖票002 {
private static int ticketCount = 20;// 共20张票
private static int windowCount = 5;// 共5个窗口同时售票
private 多线程卖票002() {}
static class SaleTicketTask implements Runnable {
public void run() {
while (ticketCount > 0) {// 只要有票就持续卖票
// 多个线程可同时进入到此行
synchronized (SaleTicketTask.class) {// 加同步关键字,是限制同一时间只能一个窗口进行卖票,注意此处的锁(个人习惯使用类.class,因为唯一)
if (ticketCount > 0) {// 当同时进入while循环的线程数多于剩余票数时,若不加此判断,将会出现0或负数票号
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
System.out.println("窗口[ " + Thread.currentThread().getName() + " ]卖出[ " + ticketCount + " ]号票。");
ticketCount--;
if (ticketCount == 0) {
System.err.println("票已售完。");
}
}
}
}
}
}
public static void main(String[] args) {
SaleTicketTask saleTicketTask = new SaleTicketTask();
ExecutorService executorService = Executors.newFixedThreadPool(windowCount);
for (int i = 0; i < windowCount; i++) {
executorService.execute(saleTicketTask);
}
executorService.shutdown();
}
}