Hallo zusammen,
ich hab eine Frage zu meiner Klasse. Es gibt insgesamt vier Klassen, Car, Queue, Garage und
Meine Frage ist, wie bekomme ich in der run Methode die Endlosschleife weg? Meine Vorstellung wäre, ich möchte die size der Queue abfragen und sobald sich der Zustand der Queue ändert, sollen meine Mechaniker arbeiten. Sobald die Queue dann leer ist, soll das Programm beendet werden.
Für ein solche vorhaben müsste ich ein Observer nutzen oder geht das irgendwie auch noch anders?
In der Garage erstelle ich die Mechaniker, dort gibt es eine Liste mit Autos (Cars) und die Mechaniker nehmen sich Autos aus dieser Liste. Wie oben beschrieben wäre es toll wenn ich diese Endlosschleife beenden könnte. Mir fällt dazu aber nur Observer ein. Ist das vielleicht zu "Overkill" geht es auch "einfacher"? Würde mich sehr über eine Antwort von euch freuen
Hier auch noch sehr gerne die restlichen Klassen:
Garage:
Queue:
(Die Methode putCar müsste nicht Synchronized sein, weiß ich, hab es aber jetzt so gelassen
Car:
ich hab eine Frage zu meiner Klasse. Es gibt insgesamt vier Klassen, Car, Queue, Garage und
Java:
public class CarMechanic extends Thread {
private Queue q;
private int id;
CarMechanic(Queue q, int id) {
this.q = q;
this.id = id;
}
public void run() {
while (true) {
Car c = q.getCar();
if (c != null) {
c.repair(id);
} else {
try {
sleep(1000);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
}
}
Meine Frage ist, wie bekomme ich in der run Methode die Endlosschleife weg? Meine Vorstellung wäre, ich möchte die size der Queue abfragen und sobald sich der Zustand der Queue ändert, sollen meine Mechaniker arbeiten. Sobald die Queue dann leer ist, soll das Programm beendet werden.
Für ein solche vorhaben müsste ich ein Observer nutzen oder geht das irgendwie auch noch anders?
In der Garage erstelle ich die Mechaniker, dort gibt es eine Liste mit Autos (Cars) und die Mechaniker nehmen sich Autos aus dieser Liste. Wie oben beschrieben wäre es toll wenn ich diese Endlosschleife beenden könnte. Mir fällt dazu aber nur Observer ein. Ist das vielleicht zu "Overkill" geht es auch "einfacher"? Würde mich sehr über eine Antwort von euch freuen
Hier auch noch sehr gerne die restlichen Klassen:
Garage:
Java:
public class Garage {
private Queue q = new Queue();
public Garage() {
for (int i = 0; i < 10; i++)
new CarMechanic(q, i).start();
}
public void dropCar(Car car) {
q.putCar(car);
}
public static void main(String[] args) {
Garage g = new Garage();
for(int i = 0; i < 120; i++)
g.dropCar(new Car());
}
}
Queue:
Java:
import java.util.ArrayList;
public class Queue {
private ArrayList<Car> element;
Queue() {
element = new ArrayList<>();
}
public synchronized void putCar(Car c) {
element.add(c);
}
public synchronized Car getCar() {
if (element.isEmpty())
return null;
Car c = element.get(0);
element.remove(0);
return c;
}
public boolean isEmpty() {
return element.isEmpty();
}
}
Car:
Java:
public class Car {
private int id;
static int i = 0;
Car() {
id = i++;
}
public void repair(int id) {
System.out.println("Mechaniker " + id + ": Auto " + this.id + " wird repariert");
try {
Thread.sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public int getId() {
return id;
}
}