2016-10-27 1 views
-1

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 
… 

Répondre

0

Sans faire vos devoirs pour vous, pensez peut-être à mettre les sémaphores dont vous avez besoin dans un tableau de n listes, où n est le nombre de étages. Lorsque la personne dit à l'ascenseur qu'elle veut aller à l'étage i, l'ascenseur met son sémaphore dans la i ème liste. L'ascenseur peut alors signaler à tous les sémaphores de cette liste de laisser partir les personnes qui descendent à cet étage.