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