Ich versuche, mir Semaphore verständlich zu machen. Diese Code funktioniert mit wait() und notifayAll() ganz schön, aber kriege ich gleiches Ergebnis mit Semaphore leider nicht. Also meistens sind die Autos gleichzeitig eingefahren und dann ausgefahren.
Java:
public class ParkingGarage {
private int plaetze;
public ParkingGarage(int plaetze) {
if (plaetze < 0) {
plaetze = 0;
}
this.plaetze = plaetze;
}
public synchronized void einfahren() {
while (plaetze == 0) {
try {
this.wait();
} catch (InterruptedException e) {
}
}
plaetze--;
}
public synchronized void verlassen() {
this.notify();
plaetze++;
}
}
class ThreadCar extends Thread {
private ParkingGarage parkhaus;
public Auto(String name, Parkhaus parkhaus) {
super(name);
this.parkhaus = parkhaus;
}
@Override
public void run() {
while (true) {
try {
sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
}
parkhaus.einfahren();
System.out.println(getName() + ": eingefahren");
try {
sleep((int) (Math.random() * 2000));
} catch (InterruptedException e) {
}
System.out.println(getName() + ": ausgefahren");
parkhaus.verlassen();
}
}
}
class Main{
public static void main(String[] args){
ParkingGarage parkhaus = new ParkingGarage(3);
for (int i = 1; i <= 5; i++) {
new ThreadCar("Car " + i, parkhaus).start();
}
}
}
##################################### Sempahore
public class ParkingGarage {
private int plaetze;
public ParkingGarage(int plaetze) {
if (plaetze < 0) {
plaetze = 0;
}
this.plaetze = plaetze;
}
public void einfahren() {
plaetze--;
}
public void verlassen() {
plaetze++;
}
}
class ThreadCar extends Thread {
private ParkingGarage parkhaus;
Semaphore semaphore;
public Auto(String name, ParkingGarage garage, Semaphore semaphore) {
super(name);
this.parkhaus = garage;
this.semaphore = semaphore;
}
@Override
public void run() {
while (true) {
try {
semaphore.acquire();
sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
}
parkhaus.einfahren();
System.out.println(getName() + ": eingefahren");
try {
sleep((int) (Math.random() * 2000));
} catch (InterruptedException e) {
}
System.out.println(getName() + ": ausgefahren");
parkhaus.verlassen();
semaphore.release();
}
}
}
class Main{
public static void main(String[] args){
ParkingGarage parkhaus = new ParkingGarage(3);
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 5; i++) {
new ThreadCar("Car " + i, parkhaus,semaphore).start();
}
}
}