模拟电梯的多线程和信号量

Multithreading and semaphores to simulate an Elevator

所以,我有一个项目,我在其中使用线程和信号量模拟电梯。所以,我正在使用 arrayList 来存储电梯将去的楼层。 49人,当时只能进去7个人。我不能对逻辑使用 sync 或 sleep 或 availablePermits。所以我坚持的是让电梯发出信号让线程在适当的楼层离开电梯。我被告知我应该使用一个数组来存储信号量,因为当电梯到达他们所在的楼层时,他们将发出线程退出的信号。我不完全明白如何编写代码。我了解如何将值存储在数组中,但是我不明白我将如何使用它来触发乘客的部分。并且线程本身将打印它离开

模拟器

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.LinkedHashSet;
    import java.util.Set;

    public class Simulator 
    {
        //Creates ArrayList

   static ArrayList<Integer> visit_floors = new ArrayList<Integer();
        static ArrayList<Person> passengers = new ArrayList<>();

        static volatile int currentFloor;
        public static void main(String[] args) throws Exception
        {

            //Creates elevator and PassengerThread
            Thread elevator = new Thread(new Elevator());
            Threads passenger = new Threads();
            elevator.start();
            passenger.startThreads();
            Collections.sort(visit_floors);
            clearDupl();
        //  System.out.println(visit_floors);
            //System.out.println(Elevator.Passenger);
        }


        public static void clearDupl()
        {
            visit_floors = new ArrayList<Integer>(new LinkedHashSet<Integer>(visit_floors));
        }

    }

线程数

import java.util.ArrayList;
import java.util.List;import java.util.Random;
import java.util.concurrent.Semaphore;

public class Threads 
{
private int numThreads = 49;
public Thread passengerT[] = new Thread[numThreads];
private int num;
    public static int RandomFloor()
    {
        Random random = new Random();
        int floor = random.nextInt(6) + 2;
        return floor;
    }
     public void startThreads() throws Exception
     {
        //Creates ArrayList
        //ArrayList<Integer> visit_floors = new ArrayList  <Integer>(); 
        //Creates Passenger Threads
        for(int i=1;i<numThreads;++i)
        {
            passengerT[i] = new Thread(new Person(i,RandomFloor()));
            passengerT[i].start();
            try {
                passengerT[i].join();

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
}
}

    import java.util.ArrayList;
    import java.util.Random;
    import java.util.concurrent.Semaphore;

    public class Person implements Runnable {

        //Defines person
        int passenger;
        int floor;
        private int numThreads = 49;
        Elevator e = new Elevator();
        //Defines the sem with 7 keys to give
        static Semaphore sem = new Semaphore(passengerSem());

        public Person(){};

        public Person(int person,int floor)
        {
            this.passenger=person;
            this.floor=floor;
            Simulator.visit_floors.add(floor);
        }
        public void run()
        {

            System.out.println("Person "+passenger+" enters the elevator to go to floor "+floor);

            try
            {

            //Adds permit to elevator
            //wait for key
            Elevator.signalElevator();
            sem.acquire();

            //Give access to the next 7 threads into elevator

            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        public static int passengerSem()
        {
            return 6;
        }

    }

电梯

import java.util.ArrayList;
    import java.util.Random;
    import java.util.concurrent.Semaphore;

    public class Person implements Runnable {

        //Defines person
        int passenger;
        int floor;
        private int numThreads = 49;
        Elevator e = new Elevator();
        //Defines the sem with 7 keys to give
        static Semaphore sem = new Semaphore(passengerSem());

        public Person(){};

        public Person(int person,int floor)
        {
            this.passenger=person;
            this.floor=floor;
            Simulator.visit_floors.add(floor);
        }
        public void run()
        {

            System.out.println("Person "+passenger+" enters the elevator to go to floor "+floor);

            try
            {

            //Adds permit to elevator
            //wait for key
            Elevator.signalElevator();
            sem.acquire();

            //Give access to the next 7 threads into elevator

            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        public static int passengerSem()
        {
            return 6;
        }

    }

示例输出

Elevator door opens at floor 1
Person 0 enters elevator to go to floor 5
Person 1 enters elevator to go to floor 2
Person 2 enters elevator to go to floor 8
Person 3 enters elevator to go to floor 4
Person 4 enters elevator to go to floor 6
Person 5 enters elevator to go to floor 7
Person 6 enters elevator to go to floor 2
Elevator door closes
Elevator door opens at floor 2
Person 1 leaves elevator  
Person 6 leaves elevator  
Elevator door closes
Elevator door opens at floor 4
Person 3 leaves elevator  
Elevator door closes
Elevator door opens at floor 5
Person 0 leaves elevator  
Elevator door closes
Elevator door opens at floor 6
Person 4 leaves elevator  
Elevator door closes
Elevator door opens at floor 7
Person 5 leaves elevator  
Elevator door closes
Elevator door opens at floor 8
Person 2 leaves elevator  
Elevator door closes
Elevator door opens at floor 1
…

在不为您做功课的情况下,不妨考虑将您需要的信号量放入 n 列表的数组中,其中 n 是楼层数。当这个人告诉电梯他/她想去楼层 i 时,电梯将他/她的信号量放入第 i 层。然后电梯可以向该列表中的所有信号量发出信号,让在该楼层下车的人离开。