Hallo Community,
ich wende mich mich einem Problem an euch, bei dem es sich um Threads und Semaphoren handelt. Ich habe ein Programm geschrieben, bei dem Threads verschiedene Komponenten (Drucker, Scanner, etc) beanspruchen und wieder freilassen. Genauer gesagt habe ich 3 Threads und 5 Komponenten. Die Threads erzeugen sich in jedem Durchlauf eine Zufallszahl zwischen 1 und 5 (Repräsentiert die Komponente). Dann wird die Komponente angefodert, die der Zahl entspricht. Dies geschieht durch den Befehl:
Komponenten.drucker.take_it(this.name);
Wie man sieht, sind die Komponenten statisch und in einer extra Klasse zu Verfügung gestellt.
Dies als Einführung in mein Programm, jetz kommen wir dem Problem schon etwas näher ;P Diese Funktion take_it(String name) hat einen private Semaphore in sich, der durch die Funktion (wenn die Deadlock Prüfung false ergibt) aquired wird. Wenn der Thread fertig ist, gibt er die Komponente mit der Funktion return_it() zurück, die sich ebenfalls in der Klasse "Komponente" befindet.
/*PROBLEM WURDE UPGEDATED*/
Es funktioniert im Großen und Ganzen, nur mein Problem ist, dass bei dem aquire des Semaphores der Thread einfriert (durch Testausgaben bestätigt)
Codestücke: Die take_it(String name) Funktion. Befindet sich in der Klasse Komponente (In der Klasse "Komponenten" werden dann 5 Komponenten mit dem namen drucker, scanner, etc angelegt, statisch)
Die Deadlockpruefung habe ich rausgeschnitten, an der wirds nicht liegen und die funktioniert
Ist relativ lange ^^
Die Funktion return_it()
Danke im Vorraus
hoffe auf hilfreiche antoworten ;P
ich wende mich mich einem Problem an euch, bei dem es sich um Threads und Semaphoren handelt. Ich habe ein Programm geschrieben, bei dem Threads verschiedene Komponenten (Drucker, Scanner, etc) beanspruchen und wieder freilassen. Genauer gesagt habe ich 3 Threads und 5 Komponenten. Die Threads erzeugen sich in jedem Durchlauf eine Zufallszahl zwischen 1 und 5 (Repräsentiert die Komponente). Dann wird die Komponente angefodert, die der Zahl entspricht. Dies geschieht durch den Befehl:
Komponenten.drucker.take_it(this.name);
Wie man sieht, sind die Komponenten statisch und in einer extra Klasse zu Verfügung gestellt.
Dies als Einführung in mein Programm, jetz kommen wir dem Problem schon etwas näher ;P Diese Funktion take_it(String name) hat einen private Semaphore in sich, der durch die Funktion (wenn die Deadlock Prüfung false ergibt) aquired wird. Wenn der Thread fertig ist, gibt er die Komponente mit der Funktion return_it() zurück, die sich ebenfalls in der Klasse "Komponente" befindet.
/*PROBLEM WURDE UPGEDATED*/
Es funktioniert im Großen und Ganzen, nur mein Problem ist, dass bei dem aquire des Semaphores der Thread einfriert (durch Testausgaben bestätigt)
Codestücke: Die take_it(String name) Funktion. Befindet sich in der Klasse Komponente (In der Klasse "Komponenten" werden dann 5 Komponenten mit dem namen drucker, scanner, etc angelegt, statisch)
Die Deadlockpruefung habe ich rausgeschnitten, an der wirds nicht liegen und die funktioniert
Code:
public void take_it(String user){
//Überprüfung auf Deadlock
System.out.print(user + " required " + this.name + " ...\n");
if(user.equals("Thread1")){
if(//Deadlockpruefung ... ){
System.out.print("//Ausgabe, Hinweis auf Deadlock");
try {
Tester.T1.sleep(10);
Tester.T2.sleep(10);
Tester.T3.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.exit(1);
}
else{
System.out.print("Successfully required!\n\n");
this.user=user;
try {
semaphore.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else if(user.equals("Thread2")){
.
.
.
.
Die Funktion return_it()
Code:
public void return_it(){
System.out.print(this.user + " returned " + this.name + "!\n\n");
this.user="No User";
semaphore.release();
}
Danke im Vorraus
hoffe auf hilfreiche antoworten ;P
Zuletzt bearbeitet: