Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo erstmal, also ich versuche gerade Threads zu verstehen, dazu folgenden Code:
Code:
public class myThread extends Thread {
static int v=0;
public void run(){
for (int i=0; i<10; i++) {
v=v+1;
}
System.out.println(v);
}
public static void main( String[] args ) {
new myThread().start();
new myThread().start();
System.out.println("ende");
}
}
Als Ausgabe erhält man
ende
10
20
Ist es also so, dass erst der 1. myThread startet fertig wird mit zählen bis 10 und dann der 2. startet und bis 20 zählt?
Code:
public class threadExample extends Thread {
static char last;
static long count=1000000000;
char thName;
threadExample (char name) { thName =name; }
public void run(){
while (count -- >0) {
if ( last != thName) {
last = thName;
System.out.print(thName);
}}}
public static void main( String[] args ) {
new threadExample ('A').start(); // new thread
new threadExample ('B').start();
new threadExample ('C').start();
}}
Hier ist die Ausgabe "ABCABCABCABCABCABCAABCA"
Wird hier also nicht ein thread nach dem anderen abgearbeitet ?? (wie oben)
wieso ist die ausgabe nicht einfach "ABC"?
Threads laufen parrallel. Das heisst, um auf dein obiges Beispiel zu sprechen zu kommen, dass jeder Thread, wenn er an der Reihe ist den Integer-Wert um eins erhöht, dann von Sheduler unterbrochen wird und der zweite Thread sein bestes gibt. Immer so weiter, bis beide Thread abgearbeitet sind.
Wenn du auf den ersten Thread warten willst, benutz die join()-Methode von Thread.
Kleines Exempel:
Code:
Thread runner1 = new Thread(/* Das Runnable Interface */);
Thread runner2 = new Thread(/* Auch ein Runnable */);
runner1.start();
runner2.start();
try { runner1.join(); } catch (InterruptedException ex) {}
try { runner2.join(); } catch (InterruptedException ex) {}
ich meine verstanden zu haben das threads quasiparallel laufen, also denen wird die cpu zufällig entzogen.
aber warum ist die ausgabe von Code-Teil 1 immer
ende
10
20
und nicht z.B.
ende
12
20
weil z.b. der 1. thread bis 9 kommt, dann der 2. thread bis 2, dann der 1. fertig wird (dann ist v=9+2+1=12)
und 12 ausgegeben wird, dann noch der 2. seine letzten 8 draufrechnet und 20 rauskommt?
also ich habs mal mit i<10000000 compiliert und da kamen immer verschiedene werte nur eins wundert mich noch,
die letzte zahl muss doch immer 20000000 sein oder (war auch im test meistens so, aber..)? weil dann ja beide threads fertig sind, warum ergab eine ausgabe aber
Ist keine atomare Operation (ebenso wie count--). Wenn mehrere Threads da am basteln sind, ist das Ergebnis öfter mal 'überraschend'.
Jetzt weißt du zumindest warum Threads synchronisiert werden müssen :wink: