Hallo,
ich wollte nun mal Semaphore einsetzen für eine Parkhaus-Simulation.
Das Parkhaus hat, durch das Sempaphor vorgegeben, 10 Stellplätze.
20 Autos versuchen nun in diesem Parkhaus zu parken:
Parken => sem.acquire()
Los fahren => sem.release()
Jetzt lasse ich in erine Schleife die Autos einfahren, eine kurze Zeit
warten (sleep()) und dann wieder losfahren. Wenn das Parkhaus voll
ist, sollen die anderen Autos natürlich so lange warten.
Jetzt habe ich die Situation, dass mein Parkhaus öffnet, 10 Fahrzeuge
parken und es dann wieder schließt. Es fahren keine Autos wieder ab
und vor allem konnten nicht alle 20 Autos parken.
Das Programm terminiert auch nicht:
ich wollte nun mal Semaphore einsetzen für eine Parkhaus-Simulation.
Das Parkhaus hat, durch das Sempaphor vorgegeben, 10 Stellplätze.
20 Autos versuchen nun in diesem Parkhaus zu parken:
Parken => sem.acquire()
Los fahren => sem.release()
Jetzt lasse ich in erine Schleife die Autos einfahren, eine kurze Zeit
warten (sleep()) und dann wieder losfahren. Wenn das Parkhaus voll
ist, sollen die anderen Autos natürlich so lange warten.
Jetzt habe ich die Situation, dass mein Parkhaus öffnet, 10 Fahrzeuge
parken und es dann wieder schließt. Es fahren keine Autos wieder ab
und vor allem konnten nicht alle 20 Autos parken.
Das Programm terminiert auch nicht:
Java:
import java.util.Random;
class Car extends Thread {
private static final Random rand = new Random();
private Parkhouse parkhouse;
public Car(Parkhouse aParkhouse) {
parkhouse = aParkhouse;
}
public void run() {
while(true) {
parkhouse.enter();
busy();
parkhouse.exit();
}
}
private void busy() {
try {
sleep(rand.nextInt(500));
}
catch (InterruptedException e) {}
}
}
Java:
import java.util.concurrent.Semaphore;
class Parkhouse {
private Semaphore sem = new Semaphore(9);
public void openParkhouse() {
System.out.println("Das Parkhaus öffnet!");
}
synchronized public void enter() {
System.out.println("Auto parkt!");
try {
sem.acquire();
} catch (InterruptedException e) {}
}
synchronized public void exit() {
System.out.println("Auto fährt!");
sem.release();
}
public void closeParkhouse() {
System.out.println("Das Parkhaus schließt!");
}
}
Java:
public class Main {
public static void main(String[] args){
Parkhouse parkhouse = new Parkhouse();
Car[] auto = new Car[20];
Thread[] thread = new Thread[20];
parkhouse.openParkhouse();
for (int i = 0; i < auto.length; i++) {
auto[i] = new Car(parkhouse);
}
for (int i = 0; i < auto.length; i++) {
thread[i] = new Thread(auto[i]);
thread[i].start();
}
parkhouse.closeParkhouse();
}
}