Per Semaphoren threadsave

Status
Nicht offen für weitere Antworten.

eQuest

Mitglied
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 ^^

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:

Marco13

Top Contributor
Ist schon arg viel rausgeschnitten - bei solchen Threading-Sachen kann jeder Furz relevant sein. Aber beim ersten draufschauen:


System.out.print("Successfully required!\n\n");
this.user=user;
try { semaphore.acquire(); ...

Das kann ja nicht stimmen. Vorausgesetzt, dass mit "required" eigentlich "acquired" gemeint war, sollte man ja ERST acquiren, und DANN den neuen User setzen und die Meldung ausgeben...
 

eQuest

Mitglied
ja ich habe recht viel rausgeschnitten; Aus dem Grund, weil der Rest eigentlich funktioniert und ich die groben Informationen in die Angabe gepackt habe. Den Fehler konnte ich, wie gesagt, auf das semaphore.aquire beschränken. Ja ok, das mit der Ausgabe kann man noch nach hinten haun, aber den Fehler löst das nicht wirklich =\
 

Marco13

Top Contributor
OK, vorher ging etwas anderes nicht, als jetzt (das im ursprünglichen Beitrag zu editieren kann aber verwirrend sein....). JETZT ist das Problem wohl ein Deadlock. .... Hm. Vermutlich wäre es zu viel verlangt, ein compilierbares Programm zu posten, wo der Fehler auftritt....?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben