From 67e31dba87a37fdf8ea454db296b4c105033eef0 Mon Sep 17 00:00:00 2001 From: Xi Xu Date: Mon, 22 Apr 2024 23:27:46 +0800 Subject: [PATCH] add package ticket --- ticket/Test.java | 29 ++++++++++++++++ ticket/TicketSeller.java | 74 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 ticket/Test.java create mode 100644 ticket/TicketSeller.java diff --git a/ticket/Test.java b/ticket/Test.java new file mode 100644 index 0000000..503ccec --- /dev/null +++ b/ticket/Test.java @@ -0,0 +1,29 @@ +package ticket; + +import java.util.Scanner; + +public class Test { + public static void main(String[] args) { + TicketSeller ts = new TicketSeller(1, 1, 1, 1, 1); + String name; + int payment; + boolean continueBuy = true; + Scanner sc = new Scanner(System.in); + while (continueBuy) { + System.out.print("Please enter your name: "); + name = sc.next(); + System.out.print("Please enter your payment: "); + payment = sc.nextInt(); + Thread consumer = new Thread(ts, name + "-" + payment); + consumer.start(); + try { + consumer.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("Do you want to continue buying tickets? Y: Yes, N: No"); + continueBuy = sc.next().equalsIgnoreCase("Y"); + } + sc.close(); + } +} \ No newline at end of file diff --git a/ticket/TicketSeller.java b/ticket/TicketSeller.java new file mode 100644 index 0000000..8faa684 --- /dev/null +++ b/ticket/TicketSeller.java @@ -0,0 +1,74 @@ +package ticket; + +public class TicketSeller implements Runnable { + private int five, ten, twenty, fifty, hundred; + + public TicketSeller(int five, int ten, int twenty, int fifty, int hundred) { + this.five = five; + this.ten = ten; + this.twenty = twenty; + this.fifty = fifty; + this.hundred = hundred; + } + + @Override + public synchronized void run() { + String threadName = Thread.currentThread().getName(); + String[] threadNameArr = threadName.split("-"); + String userName = threadNameArr[0]; + int payment = Integer.valueOf(threadNameArr[1]); + boolean success = false; + while (!success) { + switch (payment) { + case 5: + five++; + success = true; + break; + case 10: + if (five > 0) { + five--; + ten++; + success = true; + } + break; + case 20: + if (ten > 0 && five > 0) { + ten--; + five--; + twenty++; + success = true; + } else if (five >= 3) { + five -= 3; + twenty++; + success = true; + } + break; + case 50: + if (ten > 0 && five > 0) { + ten--; + five--; + fifty++; + success = true; + } else if (five >= 3) { + five -= 3; + fifty++; + success = true; + } + break; + default: + throw new IllegalArgumentException("Invalid payment amount!"); + } + if (!success) { + System.out.println(userName + ": Unable to get change, ticket purchase failed, waiting!"); + try { + wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + System.out.println(userName + ": Ticket purchase successful!"); + notifyAll(); + } + } + } +} \ No newline at end of file