Threads

Versuche mich gerade an Threads und hab noch ein, zwei kleine Probleme damit.

1.) An welchen stellen benutze ich Threads ?

Imo habe ich eine Klasse die mir ein Paar Label, Button usw. schön anordnet und die ActionListener dazu verwaltet. In der Klasse rufe ich einige andere Klassen auf die eigentlich nur Werte beinhalten dazu geter und Seter Methoden. Reicht es jetzt wenn ich einen Thread erzeuge der auf eine “Normale” Klasse zugreift um einen Wert zu setzen.

also was wie

Class KlasseA{
private static int a;
public setA(int x){
this.a=x;
}

Class KlasseB implements Runnable{
KlasseA iwas = new KlasseA();
public void run(){
iwas.setA(3);
}
}

reicht das so? Oder ist es besser wenn klasseA auch ein Thread wird? Läuft zwar so aber ich mache mir etwas sorgen das es so nicht ideal ist wenn ich mehrere Threads habe die auf Klasse a zugreifen wollen.

  1. Performance
    wieviel Ressourcen schluckt so ein Thread wenn ich da einfach auf irgend etwas warte?
if(iwas==0){
...
}
}```

3)

imo teste ich gerade so 

```while(true)[
if(iwas==0){
System.Out.Print(1);
}
}```

tuts nicht 

```while(true)[
System.Out.Print(iwas);
if(iwas==0){
System.Out.Print(1);
}
}```

tuts 

??????

Brechen Threads iwann automatisch ab wenn nichts passiert ? Bin hier gerade etwas verwirrt.

(Möge man mich verbessern wenn ich falsch liege…)

[ol]
[li]Thread benutzt du immer dann, wenn ein langfristiger Prozess ausgefürht werden soll, dieser aber das eigentliche (Haupt-) Programm nicht am fortfahren hindern soll. Zum Beispiel hast du ein Ftp Programm. Nun will der user irgendetwas vom server downloaden, sagen wir ein langes video. (Das kann ja ziemlich lange dauern). Wenn das nicht in einem eigenen Thread laufen würde, würde der Rest des Programms so lange anhalten, bis der download getätigt wäre. Sprich keine buttons anklicken, er könnte das gnaze nicht abbrechen, nicht ins menü gehen und so weiter. Ist das einigermassen verständlich? ^^
[/li]Generell gilt aber weniger ist mehr. Meistens lässt sich alles mit 1 - 2 Threads realisieren, und damit natürlich ressourcen einsparen.
[li]Da kann ich dir leider keine genaue auskunft geben, aber es ist nicht wenig.
[/li][li]Das kann nicht sein, da hast du irgendeinen Tippfehler eingebuat. While true ist while true, und wird unendlich ausgeführt. (Es sei denn du baust ein break ein…). Der THread wechselt erst zum Status “tot” (so heisst das wirklich ^^), wenn die run methode verlassen wird.
[/li][/ol]

Threads benutzt man immer dann, wenn Dinge parallel laufen sollen. Das Beispiel mit dem FTP-Programm war schon ganz gut, prinzipiell sind grafische Oberflächen, die mit Swing erstellt werden, immer in einem extra Thread.
Diese Art der Parallelität (im Fachjargon “Nebenläufigkeit”) dient also dazu, das Antwortverhalten der Anwendung zu verbessern.

Manchmal möchte man auch Dinge parallel laufen, um das Programm zu beschleunigen, beispielsweise, wenn umfangreiche Berechnungen gemacht werden oder mehrere Verbindungen für Datentransfers benötigt werden.

In einer Endlosschleife zu warten ist normalerweise keine gute Idee (das erzeugt 100% CPU-Auslastung). Besser benutzt man blockierende Methoden. Beispiele sind [japi]BlockingQueue#take()[/japi] oder [japi]CountDownLatch#await()[/japi].

Man sollte nach Möglichkeit so gut es geht die vorhandenen Klassen verwenden, um mit Nebenläufigkeit umzugehen und möglichst wenig selbst stricken.

Threading ist kein einfaches Thema…

Edit: ein [japi]CountDownLatch[/japi] ist für dein Beispiel übrigens perfekt geeignet.

Danke euch habs denke ich mittlerweile soweit verstanden, zumindestens die Basics zum Thema. Blocking und Count Down werde ich mir noch angucken.

Eine Frage noch mit den Threads wollte ich Netzwerk Listener (ka iwe die jetzt korrekt heißen) simulieren, die doch Quasi auch einfach permanent warten das was kommt oder? … bin noch nicht so weit, aber hatte es mir so vorgestellt. Geht es mit den Netzwerk Listener einfacher oder brauche ich am ende auch blockierende Methoden o.ä die auf den Netzwerk Listener warten?