Java Threads laufen nicht parallel ab

Zyboarg

Ensign
Registriert
Juli 2012
Beiträge
218
Hey Leute,
Ich habe in einem kleinen Demo Programm veruscht mehrere Threads nebenläufig auszuführen.
Dabei habe ich zwei Thread Objekte über
Code:
Thread t1 = new Thread(new Runnable(){@Override public void run()
{
// Mach irgendwas
}})

mit t1.start(); (bzw t2.start() für den zweiten Thread) gestartet und so nacheinander laufen lassen

Als ich das ganze mit einer einfachen Konsolenausgabe kombiniert habe kam allerdings nur eine sequenzielle Abfolge in Form von:
0
1
2
3
4
5
... usw bis 20
Sat Apr 18 11:47:20 CEST 2015
Sat Apr 18 11:47:20 CEST 2015
Sat Apr 18 11:47:20 CEST 2015
Sat Apr 18 11:47:20 CEST 2015
... usw bis 20 Ausgaben

Verarbeitet mein Prozessor die Daten zu schnell oder wo liegt das Problem?
LG Zyboarg
 
Zuletzt bearbeitet:
Was für eine Ausgabe hast du denn erwartet?

Thread 1 startet und schreibt "1", zeitgleich zum schreiben startet Thread 2 und schreibt "2"...

Mach mal ein Sleep (oder wie auch immer das in Java heißt) von einer Sekunde oder so dazu, wenn nach einer Sekunde alle zeitgleich schreiben, weißt du, dass sie parallel gewartet haben..
 
Die Konsolenausgabe wird über eine Schleife ausgeführt die der besagte Thread startet.
Als Ausgabe hätte ich etwas wie:

0
1
2
3
4
Sat Apr 18 11:47:20 CEST 2015
5
6
7

usw erwartet
 
Zuletzt bearbeitet:
Dann mach mal was kompliziertes in den thread rein was er noch bearbeiten muss... dann siehst du das sie parallel aber nicht synchron laufen. wenn du natürlich bei beiden nur eine Ausgabe machst "überholt" der eine den anderen nicht... -> Sowas lernt man in der Ausbildung / Studium recht ausführlich
 
Quatsch... Mach mal 2 Thread die von 1 - 20 zählen und du wirst schon überschneidungen haben...

Wahrscheinlich dauert einfach die Berechnung des Datums länger als die Ausgabe der Zahlen, deswegen... oder irgendetwas ist falsch gemacht...

kleines, hässliches Beispiel...

Code:
public class Test {

    public static void main(String[] args) {
        Thread t1 = new Thread() {
            public void run() {
                for(int i = 0; i< 20; i++) {
                    System.out.println("t1 "+i);
                }
            }
        };
        Thread t2 = new Thread() {
            public void run() {
                for(int i = 0; i< 20; i++) {
                    System.out.println("t2 "+i);
                }
            }
        };

        t1.start();
        t2.start();
    }
}
 
Danke thecain. Sowas ähnliches hatte ich mir selbst schon überlegt.
Habe es mal auf meine Art getestet und siehe da: Du hast recht ^^
Die Ausgabe nachdem ich kein Datum sondern nur noch eine Schleife ausgebe:

t2 :0
t2 :1
t2 :2
t2 :3
t2 :4
t2 :5
t2 :6
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
t2 :7
t2 :8
t2 :9
t2 :10
t2 :11
t2 :12
t2 :13
t2 :14
t2 :15
t2 :16
t2 :17
t2 :18
t2 :19

-----------------------CLOSE-------------------------
 
Zuletzt bearbeitet:
Kommt auch auf das Betriebssystem an, wie es die CPU Zeit zuordnet.
Kannst ja mal mit Mutex oder Semaphoren die Threads gegenseitig schlafen legen, dann abwechselnd ausgeben. Die billige Version ist einfach mal sleep dazwischen. Schläft ein Thread, ist auf jedem Fall der Andere dran.
 
Wenn Du es wirklich abwechselnd haben willst musst Du die Threads synchronisieren. Ein Thread bekommt vom OS immer eine gewisse CPU Zeit zugeordnet und bei so trivialen Sachen schafft der Thread so viele Ausgaben in seiner zugeordneten Zeit. Wenn das ganze nur auf einem Kern läuft gibt es eh kein gleichzeitig. Für die volle Kontrolle wenn eine gewisse Reihenfolge eingehalten werden soll musst Du selbst sorgen.
 
Zurück
Oben