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:
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:
Kann mir jemand weiterhelfen?
MfG
DaKirsche
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