also die aufgabenstellung ist wie folgt:
Sie sind von einer Firma beauftragt worden, eine neue Druckerverwaltung zu erstellen. Schreiben Sie ein Java-
Programm, das die folgende Situationen simuliert und den Zugang und die Abarbeitung von Druckaufträgen ausgibt:
Die Angestellten der Firma teilen sich einen Drucker. Dabei belegen die Angestellten den Drucker für eine bestimmte
Zeit exklusiv. Es gibt an zufälligen Zeitpunkten „Druckaufträge“ im Umfang von zufälliger Seitenzahl im Auftrag von
zufälligen Angestellten. Der Drucker druckt drei Blätter pro Sekunde.
meine lösung:
Beispielausgabe:
Kontrollausgabe (Mitarbeiteranzahl: 5)
Mitarbeiter mit der Nr. 1 hat einen Druckauftrag erteilt Seitenanzahl: 22
Drucken des Auftrags von Mitarbeiter Nr. 1 Seitenanzahl: 22 Dauer des Druckvorgangs: 7 Sekunden
Druckvorgang gestartet! Countdown: 7 6 5 4 3 2 1
Druckvorgang abgeschlossen!
Mitarbeiter mit der Nr. 4 hat einen Druckauftrag erteilt Seitenanzahl: 16
Drucken des Auftrags von Mitarbeiter Nr. 4 Seitenanzahl: 16 Dauer des Druckvorgangs: 5 Sekunden
Druckvorgang gestartet! Countdown: 5 4 3 2 1
Druckvorgang abgeschlossen!
Mitarbeiter mit der Nr. 5 hat einen Druckauftrag erteilt Seitenanzahl: 14
Mitarbeiter mit der Nr. 3 hat einen Druckauftrag erteilt Seitenanzahl: 19
Drucken des Auftrags von Mitarbeiter Nr. 5 Seitenanzahl: 14 Dauer des Druckvorgangs: 4 Sekunden
Druckvorgang gestartet! Countdown: 4 3 2 1
Druckvorgang abgeschlossen!
Mitarbeiter mit der Nr. 2 hat einen Druckauftrag erteilt Seitenanzahl: 12
Drucken des Auftrags von Mitarbeiter Nr. 2 Seitenanzahl: 12 Dauer des Druckvorgangs: 4 Sekunden
Druckvorgang gestartet! Countdown: 4 3 2 1
Druckvorgang abgeschlossen!
Drucken des Auftrags von Mitarbeiter Nr. 3 Seitenanzahl: 19 Dauer des Druckvorgangs: 6 Sekunden
Druckvorgang gestartet! Countdown: 6 5 4 3 2 1
Druckvorgang abgeschlossen!
-----------------------------------------------------------------------------------
das Programm funktioniert eigentlich wunderbar denk ich.
Mein Problem:
Ich hab das Programm mehrfach ausprobiert, dabei ist mir aufgefallen dass es immer
nur zu solchen ausgaben kommt:
(als beispiel)
Drucken des Auftrags von Mitarbeiter Nr. 5 Seitenanzahl: 14 Dauer des Druckvorgangs: 4 Sekunden
Druckvorgang gestartet! Countdown: 4 3 2 1
Druckvorgang abgeschlossen!
Mitarbeiter mit der Nr. 2 hat einen Druckauftrag erteilt Seitenanzahl: 12
aber es kommt nie zu solch einer ausgabe:
(als beispiel)
Drucken des Auftrags von Mitarbeiter Nr. 5 Seitenanzahl: 14 Dauer des Druckvorgangs: 4 Sekunden
Druckvorgang gestartet! Countdown: 4 3 2 1
Mitarbeiter mit der Nr. 2 hat einen Druckauftrag erteilt Seitenanzahl: 12
Druckvorgang abgeschlossen!
Dabei sind die zwei synchronisierten methoden unabhängig voneinander, so dass die eine synchronisierte methode schon ihre ausgabe machen könnte während die andere noch ihren countdown macht. aber dazu kommt es nie, es wird jedesmal gewartet bis die synchronisierte methode die den countdown durchführt alle ihre ausgaben komplett ausgeführt hat, bevor die andere synchronisierte methode ihre ausgaben macht.
Also erst wenn "Druckvorgang abgeschlossen" ausgegeben wurde gibt die andere synchronisierte methode ihren text aus.
Bedeutet es, dass die synchronisierten methoden sich immer gegenseitig aufhalten was die ausgabe betrifft?
wenn ja dann würden die threads ja nicht wirklich parallel ausgeführt werden im hinblick auf die ausgabe zumindest.
Sie sind von einer Firma beauftragt worden, eine neue Druckerverwaltung zu erstellen. Schreiben Sie ein Java-
Programm, das die folgende Situationen simuliert und den Zugang und die Abarbeitung von Druckaufträgen ausgibt:
Die Angestellten der Firma teilen sich einen Drucker. Dabei belegen die Angestellten den Drucker für eine bestimmte
Zeit exklusiv. Es gibt an zufälligen Zeitpunkten „Druckaufträge“ im Umfang von zufälliger Seitenzahl im Auftrag von
zufälligen Angestellten. Der Drucker druckt drei Blätter pro Sekunde.
meine lösung:
Java:
public class Druckerverwaltung
{
private static int mitarbeiteranzahl;
public static void main(String[] args)
{
mitarbeiteranzahl = (int)(Math.random()*10+1);
Drucker printer = new Drucker();
System.out.println("Kontrollausgabe (Mitarbeiteranzahl: " + mitarbeiteranzahl + ")");
System.out.println();
for(int i = 1; i <= mitarbeiteranzahl; i++)
{
new Thread(new Mitarbeiter(i, printer)).start();
}
}
public static int getMitarbeiteranzahl(){return mitarbeiteranzahl;}
}
Java:
public class Mitarbeiter implements Runnable
{
int nr;
int seiten;
Drucker printer;
Mitarbeiter(int nr, Drucker printer)
{
this.nr = nr;
this.printer = printer;
seiten = (int)(Math.random()*40+1);
}
public void run()
{
printer.druckAuftrag(nr, seiten);
printer.drucken();
}
}
Java:
public class Drucker extends Thread
{
int[] auftrag = new int[Druckerverwaltung.getMitarbeiteranzahl()];
public synchronized void druckAuftrag(int nr, int seitenanzahl)
{
try
{
sleep( (int)(Math.random()*5+1)*1000 );
}
catch(InterruptedException e){}
System.out.println("Mitarbeiter mit der Nr. " + nr + " hat einen Druckauftrag erteilt Seitenanzahl: " + seitenanzahl);
System.out.println();
auftrag[nr-1] = seitenanzahl;
}
public synchronized void drucken()
{
int mitarbeiterNr;
do
{
mitarbeiterNr = (int)(Math.random()*Druckerverwaltung.getMitarbeiteranzahl()+1);
}
while( !(auftrag[mitarbeiterNr-1]>0) );
int druckdauer = auftrag[mitarbeiterNr-1]/3;
System.out.println("Drucken des Auftrags von Mitarbeiter Nr. "
+ mitarbeiterNr + " Seitenanzahl: " + (auftrag[mitarbeiterNr-1])
+ " Dauer des Druckvorgangs: " + druckdauer + " Sekunden");
try
{
System.out.print("Druckvorgang gestartet! Countdown: ");
for(int i = druckdauer; i > 0; i--)
{
System.out.print(i + " ");
sleep(1000);
}
System.out.println();
}
catch(InterruptedException e){}
System.out.println("Druckvorgang abgeschlossen!");
System.out.println();
auftrag[mitarbeiterNr-1] = 0;
}
}
Beispielausgabe:
Kontrollausgabe (Mitarbeiteranzahl: 5)
Mitarbeiter mit der Nr. 1 hat einen Druckauftrag erteilt Seitenanzahl: 22
Drucken des Auftrags von Mitarbeiter Nr. 1 Seitenanzahl: 22 Dauer des Druckvorgangs: 7 Sekunden
Druckvorgang gestartet! Countdown: 7 6 5 4 3 2 1
Druckvorgang abgeschlossen!
Mitarbeiter mit der Nr. 4 hat einen Druckauftrag erteilt Seitenanzahl: 16
Drucken des Auftrags von Mitarbeiter Nr. 4 Seitenanzahl: 16 Dauer des Druckvorgangs: 5 Sekunden
Druckvorgang gestartet! Countdown: 5 4 3 2 1
Druckvorgang abgeschlossen!
Mitarbeiter mit der Nr. 5 hat einen Druckauftrag erteilt Seitenanzahl: 14
Mitarbeiter mit der Nr. 3 hat einen Druckauftrag erteilt Seitenanzahl: 19
Drucken des Auftrags von Mitarbeiter Nr. 5 Seitenanzahl: 14 Dauer des Druckvorgangs: 4 Sekunden
Druckvorgang gestartet! Countdown: 4 3 2 1
Druckvorgang abgeschlossen!
Mitarbeiter mit der Nr. 2 hat einen Druckauftrag erteilt Seitenanzahl: 12
Drucken des Auftrags von Mitarbeiter Nr. 2 Seitenanzahl: 12 Dauer des Druckvorgangs: 4 Sekunden
Druckvorgang gestartet! Countdown: 4 3 2 1
Druckvorgang abgeschlossen!
Drucken des Auftrags von Mitarbeiter Nr. 3 Seitenanzahl: 19 Dauer des Druckvorgangs: 6 Sekunden
Druckvorgang gestartet! Countdown: 6 5 4 3 2 1
Druckvorgang abgeschlossen!
-----------------------------------------------------------------------------------
das Programm funktioniert eigentlich wunderbar denk ich.
Mein Problem:
Ich hab das Programm mehrfach ausprobiert, dabei ist mir aufgefallen dass es immer
nur zu solchen ausgaben kommt:
(als beispiel)
Drucken des Auftrags von Mitarbeiter Nr. 5 Seitenanzahl: 14 Dauer des Druckvorgangs: 4 Sekunden
Druckvorgang gestartet! Countdown: 4 3 2 1
Druckvorgang abgeschlossen!
Mitarbeiter mit der Nr. 2 hat einen Druckauftrag erteilt Seitenanzahl: 12
aber es kommt nie zu solch einer ausgabe:
(als beispiel)
Drucken des Auftrags von Mitarbeiter Nr. 5 Seitenanzahl: 14 Dauer des Druckvorgangs: 4 Sekunden
Druckvorgang gestartet! Countdown: 4 3 2 1
Mitarbeiter mit der Nr. 2 hat einen Druckauftrag erteilt Seitenanzahl: 12
Druckvorgang abgeschlossen!
Dabei sind die zwei synchronisierten methoden unabhängig voneinander, so dass die eine synchronisierte methode schon ihre ausgabe machen könnte während die andere noch ihren countdown macht. aber dazu kommt es nie, es wird jedesmal gewartet bis die synchronisierte methode die den countdown durchführt alle ihre ausgaben komplett ausgeführt hat, bevor die andere synchronisierte methode ihre ausgaben macht.
Also erst wenn "Druckvorgang abgeschlossen" ausgegeben wurde gibt die andere synchronisierte methode ihren text aus.
Bedeutet es, dass die synchronisierten methoden sich immer gegenseitig aufhalten was die ausgabe betrifft?
wenn ja dann würden die threads ja nicht wirklich parallel ausgeführt werden im hinblick auf die ausgabe zumindest.