Verzahnte Threadausführung

3

3,14159265

Gast
Hallo zusammen,

ich haben folgendes Problem:

2 Klassen A und B mit einer run Methode. Sie sollen immer nacheinander ausgeführt werden, also A, B, A, B, A, B usw..
A und B stammen von der Klasse C ab.

Um dies zu Überwachen gibt es eine Methode Ü. Ü hat einen Vector<C>vec und eine run Methode. Um nun die Liste A,B,A,B... abzuarbeiten, habe ich in der run Methode folgendes geschrieben:

Java:
	public void run(){
		
		for(int i=0;i<vec.size();i++){
				
			synchronized(vec){
				
				C myC = vec.get(i); //myC ist entweder A oder B 
				if(i%2==0){//Das erste Element in vec ist immer A
					A myA = I.getA();
					myA.start();.notify();
					vec.notify();
				}
				else{//Das 2te Element in vec ist immer B
					B myB = I.getB();
					myB.start();
					vec.notify();
				}
			}
		}
	}

Allerdings kann B erst starten, wenn A abgearbeitet ist und A kann erst starten, wenn B abgearbeitet ist (ausser A ist das erste Element)..

Leider habe ich nicht so den Plan, wie man diese Abhängigkeiten erreicht.
Mit dem oben stehenden Code, wird halt nur A ausgeführt..
Wäre echt super, wenn mir einer von euch erklären kann, wie ich mein Vorhaben am besten umsetzen kann.

Vielen Dank und Gruß..
 

Marco13

Top Contributor
Unabhängig davon, was das ganze werden soll und inwieweit dieses Konstrukt überhaupt Sinn macht: Der Hauptthread könnte auf vec warten, und das vec.notify() könnte vom Thread A ausfgeführt werden. Allerdings müßte man den Kontext genauer kennen, denn vermutlich werden da ausgefeiltere Synchronisationsmechanismen erforderlich sein. ("Ausgefeilter" heißt nicht unbedingt schwieriger: java.util.concurrent bietet sicher genau das, was du brauchst - vielleicht CyclicBarrier (Java Platform SE 6) oder so...)
 
G

Gast2

Gast
Java:
            synchronized(vec){
                
                C myC = vec.get(i); //myC ist entweder A oder B 
                if(i%2==0){//Das erste Element in vec ist immer A
                    A myA = I.getA();
                    myA.start();.notify();
                    vec.notify();
                }
                else{//Das 2te Element in vec ist immer B
                    B myB = I.getB();
                    myB.start();
                    vec.notify();
                }
wenn Du in den Vector keine Element mehr einfügst, dann kannst Du die Synchronisation weglassen ... ansonsten solltest Du die Synchronisation überdenken - denn - solange wie Du den Thread abarbeitest kann nichts hinzugefügt werden ... dadurch wird ggf. der Rest blockiert

ansonsten kannst Du auch die generelle Verwaltung überdenken

Java:
Queue<C> queue;
// ...
while(queue.peek() != null)
{
    // A abarbeiten
    C c = queue.remove()
    A a = c.getA();
    a.start();
    // B abarbeiten
    C c = queue.remove()
    if (c != null)
    {
       B b = c.getB();
       b.start();
    }
}
 
3

3,14159265

Gast
Vielen Dank, das finde ich jetzt sogar noch intuitiver..

Allerdings: Wie bekomme ich es denn hin, dass A auf B wartet und umgekehrt?

B darf ja erst starten, wenn A fertig ist..
 
G

Gast2

Gast
Vielen Dank, das finde ich jetzt sogar noch intuitiver..

Allerdings: Wie bekomme ich es denn hin, dass A auf B wartet und umgekehrt?

B darf ja erst starten, wenn A fertig ist..
in dem Du nicht sinnlos Threads verwendest

Du hast einen Thread (Verwaltungsthread [VT]) der das abarbeiten verwalten soll ... dazu wird A geholt und im Thread (A-Thread [AT]) gestartet ... der VT muss aber nun warten bis der AT fertig ist ... nun wird VT reaktiviert und holt B und starten den Thread (B-Thread [BT]) ... der VT muss aber nun warten bis der BT fertig ist ... nun wird der VT erneut reaktiviert - blabla

Methoden arbeiten im gleichen Thread immer synchron ... d.h. Du brauchst A nicht als Thread starten oder B als Thread ... wenn A fertig ist, erst dann wird B abgearbeitet ... Du machst Dir mehr Arbeit als nötig ist

hand, mogel

PS: sollte es eine Hausaufgabe sein - dann ist es möglich das dieser Thread-Unsinn vom Lehrer gewollt ist :oops:
 

Neue Themen


Oben