# Thread wartet auf Threads



## Tapsi (29. Nov 2008)

Ich habe nun mehrere Threads die sich um etwas kümmern nebeneinander her und ich suche schon im ganzen forum nach der Möglichkeit sehe aber nicht durch.

Meine Frage ist :


Wie geht es dass ein Thread X auf die Threads 1,2,3,4 und 5 wartet bis sie fertig sind mit einen durchlauf ?
Wenn Thread X losloegt , sollen die 5 anderen natürich warten bis Thread X fertig und und dann selber weitermachen.


----------



## SlaterB (29. Nov 2008)

hast du denn die Grundlagen schon kennengelernt wie synchronized/ wait()/ notify() 
oder ein simples boolean-Flag und wiederholtes sleep() solange nicht die Info kommt, dass es weitergeht (Flag ändert sich)?

darüber hinaus gibt es in diesem Fall noch Thread.join(), sofern man das Thread-Objekt des anderen Threads direkt kennt


----------



## Tapsi (29. Nov 2008)

Habe ich dass bis jetzt richtig vertsanden wenn ich eine Klasse TAsk_XY erstelle und davon 2 Objekte ( Threads ) erstelle können beide nicht gleichzeitig auf eine Methode in Task_XY zugreifen ??

MEine Idee war dass ein Spielfeld 40x40 Felder hat und für jede Reihe ein Thread erstellt wird der die jeweilige Reihe zeichnet. Die Methode zeichne greift auf eine variable grafik_reihe (BufferedImage) und zeichnet die komplette Reihe.

Am ende holt die Spielschleife sich alle einzellnen Reihen zurück und zeichnet aus denen das ganze Feld.

MEine erste war das jeder Thread direkt eine Reihe auf die Endgrafik malt, aber threads können nicht alle gemeinsam in das FEld  gleichzeitig malen bzw zugreifen .. .oder irre ich mich da ?


----------



## SlaterB (29. Nov 2008)

>  wenn ich eine Klasse TAsk_XY erstelle und davon 2 Objekte ( Threads ) erstelle können beide nicht gleichzeitig auf eine Methode in Task_XY zugreifen ?? 

was ist 'eine Methode in Task_XY', ist eine statische Methode gemeint oder eine nicht-statische?
bei nicht-statischen ist bei unterschiedlichen Objekt eh nicht viel gemeinsam..

ohne Synchronisierung können normalerweise beliebige Threads querbeet durcheinander alle möglichen Methoden ausführen

> MEine erste war das jeder Thread direkt eine Reihe auf die Endgrafik malt, aber threads können nicht alle gemeinsam in das FEld gleichzeitig malen bzw zugreifen .. .oder irre ich mich da ?

wäre auszuprobieren,
klingt auf jeden Fall sinnvoll, dass nie zu tun, dass kann ja auch nicht länger als 1 ms dauern, wieso überhaupt getrennte Threads?

falls vor dem Zeichnen irgendwelche aufwendigen Berechnungen durchzuführen sind, 
so kommen die sich in mehreren Threads zumindest nicht gegenseitig in die Quere


----------



## Tapsi (29. Nov 2008)

Ich dachte so könnte die Grafikberechnung schneller sein.

Im prinzip geht jeder Thread in seiner Reihe Feld für Feld nach unten.
Erst Feld Zeichnen und dann die Einheit , dann zum Feld darunter und das gleiche Nochmal.

Oder doch lieber so :


ein Grafik-Thread der alleine Das Feld zeichnet
ein Spiel-Thread der auf die MAus achtet und Berechnungen durchführt etc. 

DAs Problem mit der Grafik ist , 40 x 40 also 1600 * 2 ( wegen Einheiten ) heißt 3200 drawImage dauert schon 500 ms...
Da dachte ich aufteilen in 40 Reihen Threads.
Meine nur ein Thread Lösung bestand bis jetzt daraus , das Feld zu zeichnen zu speichern . Dann in jedem Thread Schritt erst das Grundfeld zu holen und dann die Einheiten raufzumachen und das ans FEnster weiterzugeben. Das Problem ist das Einheiten zBsp Berge übermalen obwohl sie dahinter sein müssten.

Vielleicht jemand ne Lösung ?

==> 40 reihen Threads ???
==> FEld vorher berechnen und dann Einheiten rübermalen ???

oder gibs noch ne andere schnellere Lösung ?


----------



## SlaterB (29. Nov 2008)

zu sparsamer Grafik-Arbeit kann ich wenig beitragen,
nur zur Logik: nur weil Arbeit auf 40 Threads aufgeteilt wird, verringert sich nicht die Zeit, um diese zu erledigen,

die 40 Threads müssen sich alle einen Prozessor teilen, mit etwas Glück vielleicht 2 oder 4 auf deinem Rechner, aber 40 Prozessorkerne wirst du gewiss nicht haben,

es gibt nur wenige Aufgaben, wo Threads Arbeitszeit sparen, etwa wenn Festplattenzugriffe eine Rolle spielen,
was in den 500 ms Zeichnen hoffentlich nicht auch der Fall ist (oder hoffentlich doch, dann ließe sich noch Zeit einsparen)


in den meisten Fällen übernehmen Thread eher organisatorische Aufgaben,
wenn etwa zwei Spieler ihre jeweiligen Ziele verfolgen, wäre es für nur einen Thread mühsam,
die ersten 100 ms Aufgaben für Spieler A zu erledigen, dann mal wieder 100 ms Aufgaben für Spieler B usw.,


----------



## Tapsi (29. Nov 2008)

Achso , das gleiche habe ich mir auch gerade gedacht, schon logisch da die Arbeit die gleiche bleibt...

Dann mache ich einen Thread der sich nur um die Grafik kümmert und einen der sich um die Ereignisse des Spiels kümmert   

Wäre es vielleicht auch im Multiplayer sinnvoll für jeden Spieler ein Thread zu nehmen ?

Ich danke trotzdem das du mein Verständniss für Threads etwas verbessert hast.

PS : Cooles Forum , will ich mal so sagen


----------



## FArt (29. Nov 2008)

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CompletionService.html

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html


----------

