Donc, j'ai un projet où je simule un ascenseur en utilisant des fils et des sémaphores. Donc, j'utilise une arrayList pour stocker les étages où l'ascenseur ira. Il y a 49 personnes et seulement 7 peuvent y entrer à la fois. Je ne peux pas utiliser sync ou sleep ou availablePermits pour la logique. Donc ce que je suis bloqué, c'est que l'ascenseur signale le fil pour sortir de l'ascenseur à l'étage approprié. On m'a dit que je devrais utiliser un tableau pour stocker les sémaphores car lorsque l'ascenseur arrivera à leur étage, ils signaleront le fil pour sortir. Je ne comprends pas vraiment comment je pourrais coder ceci. Je comprends comment stocker les valeurs dans le tableau, mais la partie où j'utiliserais cela pour déclencher le passager est ce que je ne comprends pas. Et le fil lui-même imprimera qu'il quitteMultithreading et sémaphores pour simuler un ascenseur
Simulator
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));
}
}
Threads
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();
}
}
}
}
Personne
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;
}
}
Ascenseur
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;
}
}
Exemple de sortie
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
…