话不多说,直接上代码
public class Note {
/**
* 创建三个线程,模拟3个窗口,进行卖票
*/
public static void main(String[] args){
// 直接使用Thread创建线程
// 窗口001
new Thread(() -> {
while (true) {
// 获取剩余票数
int currentTickets = TicketSource.getCurrentTickets();
if (currentTickets > 0) {
TicketSource.saleTickets();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName() + ":今日票已售空!");
break;
}
}
}, "窗口001").start();
//窗口002
new Thread(() -> {
while (true) {
int currentTickets = TicketSource.getCurrentTickets();
if (currentTickets > 0) {
TicketSource.saleTickets();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName() + ":今日票已售空!");
break;
}
}
}, "窗口002").start();
//窗口003
new Thread(() -> {
while (true) {
int currentTickets = TicketSource.getCurrentTickets();
if (currentTickets > 0) {
TicketSource.saleTickets();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName() + ":今日票已售空!");
break;
}
}
}, "窗口003").start();
}
}
/**
* 订票资源类
*/
class TicketSource {
// 当前票数
private static int currentTickets = 30;
// 加锁确保多线程场景下的线程安全
private static Lock lock = new ReentrantLock();
/**
* 卖票方法 saleTickets()
*/
public static void saleTickets() {
lock.lock();
try {
if (currentTickets > 0) {
// 模拟卖票,票数减一
currentTickets--;
System.out.println(
Thread.currentThread().getName() + "窗口出票成功!"
+ "当前票剩余:" + currentTickets);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static int getCurrentTickets() {
return currentTickets;
}
}
希望对您有帮助!记得点赞、收藏、关注哦!