Create a PostalWorkerThread class that extends Thread, which will serve the customers in line. The PostalWorkerThread class will need to acquire the postalWorkerMutex semaphore to enter the critical section where it can interact with the customer threads. Once a postal worker thread finishes serving a customer, it should release the postalWorkerMutex semaphore. You also need to ensure that only one postal worker can use the scales at a time. Currently, my code creates a semaphore for scalesMutex, but it is not being used in the code. You should also add print statements to my code to match the output format mentioned in the project description. My code: import java.util.LinkedList; import java.util.Queue; import java.util.Random; import java.util.concurrent.Semaphore; public class PostOfficeSimulation { // Constants private static final int MAX_CUSTOMERS = 50; private static final int MAX_CUSTOMERS_INSIDE = 10; private static final int MAX_POSTAL_WORKERS = 3; // Semaphores private static Semaphore customerMutex = new Semaphore(1); private static Semaphore postalWorkerMutex = new Semaphore(1); private static Semaphore scalesMutex = new Semaphore(1); private static Semaphore customersInside = new Semaphore(MAX_CUSTOMERS_INSIDE); private static Semaphore postalWorkersAvailable = new Semaphore(MAX_POSTAL_WORKERS); // Task Table private static final int BUY_STAMPS_TIME = 60; private static final int MAIL_LETTER_TIME = 90; private static final int MAIL_PACKAGE_TIME = 120; // Random number generator private static Random random = new Random(); // Customer thread private static class CustomerThread extends Thread { private int id; private int task; private Semaphore semaphore; public CustomerThread(int id) { this.id = id; this.task = random.nextInt(3); this.semaphore = new Semaphore(0); } public void run() { try { System.out.printf("Customer %d created\n", id); customersInside.acquire(); System.out.printf("Customer %d enters post office\n", id); Thread.sleep(1000 * getTaskTime() / 60); System.out.printf("Customer %d asks postal worker to %s\n", id, getTaskName()); postalWorkerMutex.acquire(); postalWorkersAvailable.acquire(); System.out.printf("Postal worker %d serving customer %d\n", getPostalWorkerId(), id); scalesMutex.acquire(); Thread.sleep(1000 * getTaskTime() / 60); scalesMutex.release(); System.out.printf("Postal worker %d finished serving customer %d\n", getPostalWorkerId(), id); postalWorkersAvailable.release(); postalWorkerMutex.release(); Thread.sleep(1000); System.out.printf("Customer %d finished %s\n", id, getTaskName()); System.out.printf("Customer %d leaves post office\n", id); customersInside.release(); semaphore.release(); System.out.printf("Joined customer %d\n", id); } catch (InterruptedException e) { e.printStackTrace(); } } private int getTaskTime() { switch (task) { case 0: return BUY_STAMPS_TIME; case 1: return MAIL_LETTER_TIME; case 2: return MAIL_PACKAGE_TIME; default: return 0; } } private String getTaskName() { switch (tas.