2016-10-27 3 views
-1

したがって、私はスレッドとセマフォーを使用してエレベーターをシミュレートするプロジェクトを持っています。だから、私は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; 
     } 

    } 

サンプル出力

nは数ある nリストの配列に必要なセマフォを置くことについて考えるかもしれない、あなたのための宿題をせずに
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 
… 

答えて

0

床。エレベーターに彼が床に行くことを告げるときi、エレベーターは彼/彼女のセマフォーをi番目のリストに入れます。エレベータは、そのフロアに乗っている人々が出ることを可能にするために、そのリスト内のすべてのセマフォを通知することができる。

関連する問題