模拟电梯的多线程和信号量
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
层。然后电梯可以向该列表中的所有信号量发出信号,让在该楼层下车的人离开。
所以,我有一个项目,我在其中使用线程和信号量模拟电梯。所以,我正在使用 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
层。然后电梯可以向该列表中的所有信号量发出信号,让在该楼层下车的人离开。