Current Thread not owner

Status
Nicht offen für weitere Antworten.

DaKirsche

Mitglied
Moin moin,

ich bin ein blutiger Anfänger in Java und versuche gerade eine Konsolenbasierte Ausgabe über Threads zu verwirklichen.
Habe mit Java bisher eigentlich keinerlei Erfahrung.
Meine Programmierkenntnisse beschränken sich bisher auf Borland Delphi und die Paletgte der Websprachen...


Und zwar wollt ich folgendes machen:
Es werden 4 Objekte vom Typ Person erzeugt, sowie 4 Objekte von Typ Ressource.

Die Ressourcen werden den Person(en) via static-Variable zugewiesen.
Die Personen wählen nun per Zufallszahl ein Objekt aus, das Sie benutzen möchten.
Wenn es belegt ist sollen sie warten, bis es wieder frei ist und es dann benutzen.

Nach der Benutzung von 6 Ressourcen soll der Thread beendet werden.

So hier mal ein bisschen Code:
Code:
public class Uebung1 {

    public static void main(String[] args) {

        System.out.println("*** Es ist 09:00 Uhr morgens ***");
        System.out.println("\n*** Bestand im Fuhrpark ***");

        Ressource r1 = new Ressource("PKW");
        Ressource r2 = new Ressource("LKW");
        Ressource r3 = new Ressource("Bagger");
        Ressource r4 = new Ressource("Gabelstapler");

        System.out.println(" ");

        Person p1 = new Person("Hans");
        Person p2 = new Person("Peter");
        Person p3 = new Person("Wolfgang");
        Person p4 = new Person("Detlef");


        p1.addRessource(r1,0);
        p2.addRessource(r2,1);
        p3.addRessource(r3,2);
        p4.addRessource(r4,3);


        System.out.println("\n***Die Arbeit beginnt...***");

        p1.start();
        p2.start();
        p3.start();
        p4.start();
    }

}

class Person extends Thread{
    static int persCounter;
    static Ressource[] rs = new Ressource[4];

    private int persNr;
    private String persName;
    private int needRes = 0;
    private int worked = 0;

    public Person(String pname) {
        this.persNr = this.persCounter++;
        this.persName = pname;
        System.out.println(pname +" kommt zur Arbeit");
    }

    public  void run() {
        //Methode wird beim Aufruf des Threads gestartet
    try {
    	while(this.worked < 5) {
    		synchronized(this.getClass()) {
    		if (this.needRes <= 0) this.needRes = (int)( (Math.random() * 100)%4);
    		//System.out.println("\n\t\t\t"+this.persName+" - - - "+ (needRes));
    		if (!(this.rs[needRes].istBelegt())) {
    		//while (this.rs[needRes].istBelegt() || isInterrupted()) {Thread.currentThread().wait();};
    			this.useRes(this.rs[needRes]);
    			Thread.currentThread().notify();
    			Thread.currentThread().yield();
    		}
    		else {
    			Thread.currentThread().wait();
    		}
    	}
    	}
    	System.out.println(this.persName + " hat heute mit "+this.worked+" Maschinen gearbeitet und macht nun Feierabend!");
    	Thread.currentThread().stop();
     }
    catch (Exception e) {
    	System.out.println("!!! "+this.persName + " hat sich heute verletzt!" + e.getMessage()); //Hier wird der Fehler ausgegeben
    }
    }

    public void addRessource(Ressource r, int i) {
    	this.rs[i] = r;
    }

    public void useRes(Ressource r) {
	    	try {
	            if (!(r.istBelegt())) {
	                r.belegeRessource(this.persNr);
	                System.out.println("-OK- "+this.persName +" benutzt "+ r.getName()+"!");
	               // Thread.currentThread().notify();
	               Thread.sleep(500);
	                this.worked++;
	                this.needRes = 0;
	                System.out.println("-OK- "+this.persName +" stellt "+ r.getName()+" wieder in den Fuhrpark!");
	                r.belegeRessource(0);
	            }
	            else
	            {
	            	System.out.println("-OK- "+this.persName +" benoetigt "+ r.getName()+". "+ r.getName()+" ist belegt!");
	            	Thread.currentThread().wait();
	            }
	        }
	        catch (InterruptedException i) {
	            System.out.println("!!! "+this.persName + " ist bei der Arbeit gestorben!" + i.getMessage());
	        }
    }
}

class Ressource{
    static int resCounter;
    private int resNr;
    private String resName;
    private int belegt_von = 0;

    public Ressource(String pname) {
        this.resNr = this.resCounter++;
        this.resName = pname;
        System.out.println(pname +" steht im Fuhrpark");
    }

    public String getName() {
        return this.resName;
    }

    public void belegeRessource(int vonId) {
        this.belegt_von = vonId;
    }

    public boolean istBelegt() {
        if (this.belegt_von > 0) {
            return true;
        }
        else return false;
    }
}

Mein Problem hierbei ist nun, dass ich ständig die Exception erhalte "current Thread not owner".

Eine mögliche Ausgabe auf der Konsole ist folgende:
*** Es ist 09:00 Uhr morgens ***

*** Bestand im Fuhrpark ***
PKW steht im Fuhrpark
LKW steht im Fuhrpark
Bagger steht im Fuhrpark
Gabelstapler steht im Fuhrpark

Hans kommt zur Arbeit
Peter kommt zur Arbeit
Wolfgang kommt zur Arbeit
Detlef kommt zur Arbeit


***Die Arbeit beginnt...***
-OK- Hans benutzt Gabelstapler!
-OK- Hans stellt Gabelstapler wieder in den Fuhrpark!
!!! Hans hat sich heute verletzt!current thread not owner
-OK- Peter benutzt LKW!
-OK- Peter stellt LKW wieder in den Fuhrpark!
!!! Peter hat sich heute verletzt!current thread not owner
-OK- Wolfgang benutzt PKW!
-OK- Wolfgang stellt PKW wieder in den Fuhrpark!
!!! Wolfgang hat sich heute verletzt!current thread not owner
-OK- Detlef benutzt Gabelstapler!
-OK- Detlef stellt Gabelstapler wieder in den Fuhrpark!
!!! Detlef hat sich heute verletzt!current thread not owner

Kann mir jemand weiterhelfen?

MfG
DaKirsche
 
S

SlaterB

Gast
die Methoden notify/ wait darf man nur an den Objekten aufrufen, an denen man auch synchronized-Zugriff hat,

wenn du also
> synchronized(this.getClass()) {
benutzt, dann musst du auch
this.getClass().wait()
aufrufen usw.

das ist was anderes als Thread.sleep(), siehe Grundlagen-Lehrbuch
 

DaKirsche

Mitglied
Danke...klappt^^

Jetzt habe ich aber irgendwo nen Denkfehler...in diesen Bereich geht er leider garnicht rein:
Code:
[...]
else 
               { 
                  System.out.println("-OK- "+this.persName +" benoetigt "+ r.getName()+". "+ r.getName()+" ist belegt!"); 
                  Thread.currentThread().wait(); 
               } 
[...]

Obwohl eigentlich mehrere Personen dieselbe Ressource zugeteilt bekommen....
 
S

SlaterB

Gast
du verwendest ja immer noch
> Thread.currentThread().wait();
und nicht
this.getClass().wait()
??

wenn du dagegen
> synchronized(this.getClass()) {
auf
synchronized(Thread.currentThread()) {
umgebogen hast, dann war das eine eher schlechte Entscheidung,
denn jeder Thread ist ein eigenes Objekt, alle warten bei sich selber,
es findet keine gemeinsame Synchronisierung statt
 

DaKirsche

Mitglied
Ne...habe den Codeteil lediglich ausm 1 Post kopiert.
Code:
[...]
 {
	            	System.out.println("-Ooh- "+this.persName +" benoetigt "+ r.getName()+". "+ r.getName()+" ist belegt!");
	            	this.getClass().wait();
	            }
[...]

Sorry...

Aber zu meinem Problem jetzt geht es darum, dass folgende Ausgabe eigentlich nicht passieren sollte:
-OK- Hans benutzt LKW!
-OK- Peter benutzt LKW!
-OK- Wolfgang benutzt Gabelstapler!
-OK- Hans stellt LKW wieder in den Fuhrpark!
-OK- Peter stellt LKW wieder in den Fuhrpark!
Da nur ein Objekt "LKW" existiert sollte eigentlich angezeigt werden:
-OK- Hans benutzt LKW!
-Ooh- Peter benötigt LKW. LKW ist belegt!
-OK- Wolfgang benutzt Gabelstapler!
-OK- Hans stellt LKW wieder in den Fuhrpark!
-OK- Peter benutzt LKW!

Innerhalt der Klasse Ressource wird ja je Objekt eine Instanzvariable belegt_von deklariert...
Code:
class Ressource{
    static int resCounter;
    private int resNr;
    private String resName;
    private int belegt_von = 0;

    public Ressource(String pname) {
        this.resNr = this.resCounter++;
        this.resName = pname;
        System.out.println(pname +" steht im Fuhrpark");
    }

 [...]

    public void belegeRessource(int vonId) {
        this.belegt_von = vonId;
    }

    public boolean istBelegt() {
        if (this.belegt_von > 0) {
            return true;
        }
        else return false;
    }
}

...die innerhalt der Methode Person.useRessource(); beschrieben wird (mit Personalnummer)...
Code:
 public void useRes(Ressource r) {
	    	try {
	            if (!(r.istBelegt())) {
	                r.belegeRessource(this.persNr); //Objekt belegen
	                System.out.println("-OK- "+this.persName +" benutzt "+ r.getName()+"!");
	               Thread.yield();
	               this.getClass().notify();
                        /* Hier wird das Objekt für 500ms belegt */
                              Thread.sleep(500);
	             //  this.getClass().wait(500);
	                this.worked++;
	                this.needRes = 0;
	                System.out.println("-OK- "+this.persName +" stellt "+ r.getName()+" wieder in den Fuhrpark!");
	                r.belegeRessource(0); //Objekt wieder frei geben
	            }
	            else
	            {
	            	System.out.println("-Ooh- "+this.persName +" benoetigt "+ r.getName()+". "+ r.getName()+" ist belegt!");
	            	this.getClass().wait();
	            }
	        }
	        catch (InterruptedException i) {
	            System.out.println("!!! "+this.persName + " ist bei der Arbeit gestorben! " + i.getMessage());
	        }
    }

...aber obwohl die Ressource legt ist!
 
S

SlaterB

Gast
was ist denn nun der genaue Code?
wenn ich dem aus dem ersten Posting nehme,
dann läuft dort der synchronized-Block über die gesamte Benutzung eines Gegenstandes,

bevor also jemand etwas wieder zurückstellt kommt eh kein anderer dran,
verhindern kann man das, indem man den Monitor zwischenweise freigibt,
mit
this.getClass().wait(500);
in useRes()
statt
Thread.sleep(500);
geht das, falls useRes() immer noch im synchronized-Block ausgeführt wird

edit:
doch noch bisschen was gefunden, in meiner Version kann es gar nicht zur Ooh-Meldung kommen,
da in der run()-Methode schon nach Belegung geprüft wird,
noch ein Indiz dafür, dass du inzwischen ein ganz anderes Programm hast..


und vor allem: du hast gar nicht deine Personalnummern geprüft, das wäre doch nun wirklich nicht schwer gewesen,

mit
> static int persCounter = 0;
+
> this.persNr = this.persCounter++;
bekommt nämlich der erste Arbeiter die PersonalNr 0, damit kann man schlecht eine Ressource sperren..
 

DaKirsche

Mitglied
Ich hatte es auch schon überlegt mit this.getClass().wait();
Jetzt startet es zwar die anderen Threads, jedoch ändert sich an der Ausgabe nix.....leider...

Also der komplette Code, wie ich den jetzt habe ist folgender :

Code:
public class Uebung1 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Automatisch erstellter Methoden-Stub
        // 500ms Nutzung
        //warten auf Freigabe
        System.out.println("*** Es ist 09:00 Uhr morgens ***");

        Ressource r1 = new Ressource("PKW");
        Ressource r2 = new Ressource("LKW");
        Ressource r3 = new Ressource("Bagger");
        Ressource r4 = new Ressource("Gabelstapler");

        Person p1 = new Person("Hans");
        Person p2 = new Person("Peter");
        Person p3 = new Person("Wolfgang");
        Person p4 = new Person("Detlef");

        System.out.println("\n*** Bestand im Fuhrpark ***");

        p1.addRessource(r1,0);
        p2.addRessource(r2,1);
        p3.addRessource(r3,2);
        p4.addRessource(r4,3);

        System.out.println("\n***Die Arbeit beginnt...***");

        p1.start();
        p2.start();
        p3.start();
        p4.start();
    }

}

class Person extends Thread{
    static int persCounter;
    static  Ressource[] rs = new Ressource[4];

    private int persNr;
    private String persName;
    private int needRes = 0;
    private int worked = 0;

    public Person(String pname) {
        this.persNr = this.persCounter++;
        this.persName = pname;
        System.out.println(pname +" kommt zur Arbeit");
    }

    public  void run() {
        //Methode wird beim Aufruf des Threads gestartet
    try {
    	while(this.worked < 5) {
    		synchronized(this.getClass()) {
    		if (this.needRes <= 0) this.needRes = (int)( (Math.random() * 100)%4);    
    		if (!(this.rs[needRes].istBelegt())) {
    			this.useRes(this.rs[needRes]);
    			this.getClass().notify();
    			Thread.yield();
    		}
    		else {
    			this.getClass().wait();
    		}
    	}
    	}
    	System.out.println(this.persName + " hat heute mit "+this.worked+" Maschinen gearbeitet und macht nun Feierabend!");
    	Thread.currentThread().stop();
     }
    catch (Exception e) {
    	System.out.println("!!! "+this.persName + " hat sich heute verletzt!" + e.getMessage());
    }
    }

    public void addRessource(Ressource r, int i) {
    	this.rs[i] = r;
    }

    public void useRes(Ressource r) {
	    	try {
	            if (!(r.istBelegt())) {
	                r.belegeRessource(this.persNr);
	                System.out.println("-OK- "+this.persName +" benutzt "+ r.getName()+"!");
	               Thread.yield();
	               this.getClass().notify();
	               this.getClass().wait(500);
	                this.worked++;
	                this.needRes = 0;
	                System.out.println("-OK- "+this.persName +" stellt "+ r.getName()+" wieder in den Fuhrpark!");
	                r.belegeRessource(0);
	            }
	            else
	            {
	            	System.out.println("-Ooh- "+this.persName +" benoetigt "+ r.getName()+". "+ r.getName()+" ist belegt!");
	            	this.getClass().wait();
	            }
	        }
	        catch (InterruptedException i) {
	            System.out.println("!!! "+this.persName + " ist bei der Arbeit gestorben!" + i.getMessage());
	        }
    }
}

class Ressource{
    static int resCounter;
    private int resNr;
    private String resName;
    private int belegt_von = 0;

    public Ressource(String pname) {
        this.resNr = this.resCounter++;
        this.resName = pname;
        System.out.println(pname +" steht im Fuhrpark");
    }

    public String getName() {
        return this.resName;
    }

    public void belegeRessource(int vonId) {
        this.belegt_von = vonId;
    }

    public boolean istBelegt() {
        if (this.belegt_von > 0) {
            return true;
        }
        else return false;
    }
}

und die Ausgabe ist:
***Die Arbeit beginnt...***
-OK- Hans benutzt LKW!
-OK- Peter benutzt Gabelstapler!
-OK- Wolfgang benutzt LKW!
-B- Hans stellt LKW wieder in den Fuhrpark!
-B- Peter stellt Gabelstapler wieder in den Fuhrpark!
-B- Wolfgang stellt LKW wieder in den Fuhrpark!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Befehl current: Java Basics - Anfänger-Themen 3
D Debug Current Instruction Pointer Fehler Java Basics - Anfänger-Themen 8
P File current Java Basics - Anfänger-Themen 2
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben