Threads Anfänger

Hag2bard

Bekanntes Mitglied
Hallo, ich möchte 2 Threads parallel starten und jeden jeweils 2000ms pausieren. (Thread.sleep)
Leider funktioniert mein LösungsAnsatz nicht.

Java:
package de.threads;

import de.threads.Stoppuhr;


public class Main {

  public static void main(String[] args) {
   Stoppuhr s = new Stoppuhr(2000);
   Stoppuhr s2 = new Stoppuhr(2000);
   long st = System.currentTimeMillis();
   s.start();
   s2.start();
   long ste = System.currentTimeMillis();
   long f = ste-st;
   System.out.println (f);
  }
}
Java:
package de.threads;

import de.threads.Stoppuhr;


public class Stoppuhr extends Thread {
int time;
public Stoppuhr(int time){
  this.time = time;
}


@Override
public void run(){
  System.out.println ("Thread1");
  try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    
}
}

Er misst bei diesem Code nur wenige ms.
Wenn ich in der Main nur ein Objekt habe und 2 mal Thread.start ausführe

Java:
package de.threads;

import de.threads.Stoppuhr;


public class Main {

  public static void main(String[] args) {
   Stoppuhr s = new Stoppuhr(2000);
   long st = System.currentTimeMillis();
   s.start();
   s.start();
   long ste = System.currentTimeMillis();
   long f = ste-st;
   System.out.println (f);
  }
}

Dann kommt java.lang.IllegalThreadStateException

Jedes Tutorial welches im Internet bisher fand war sehr schlecht und hat nichts richtig erklärt.

Wie mach ich das?
 

mihe7

Top Contributor
Nein, Du musst nur zwei Stoppuhren erzeugen.

Nebenbei: Deine Zeitmessung in main wird nicht das bringen, was Du vermutlich erwartest :)
 

mihe7

Top Contributor
Er misst bei diesem Code nur wenige ms.
Ach, das hattest Du schon, sorry, bin bei den zwei Code-Teilen durcheinandergekommen.

Du hast in Deinem Fall drei Threads:
a) den Main-Thread
b) den Stoppuhr-Thread (s)
c) den Stoppuhr-Thread (s2)

Im Main-Thread startest Du also die beiden anderen Threads, so dass Du drei Threads parallel laufen hast. Daher wirst Du so auch nur wenige ms messen.

Der Main-Thread muss auf das Ende der beiden Threads warten. Das funktioniert z. B. per join.
 

mihe7

Top Contributor
Vielleicht hilft eine Skizze zum Verständnis:
Code:
        5ms    10ms        15ms
main ---+--------+---------[Zeitmessung]--
        |        |start()                                    ca. 2s
  s2    |        +---------------------------------- ... ------ Ende
        |start()                                             ca. 2s
   s    +------------------------------------------- ... ------ Ende

Du siehst, die Zeitmessung passiert quasi unmittelbar nach dem Start (die ms sind natürlich rein fiktiv).

Du willst aber etwas wie
Code:
        5ms     5ms        10ms
main ---+--------+---------+                     +--+      +---[Zeitmessung]
        |        |start()  |             2s      |  |join()|
  s2    |        +---------)----- ... ----- Ende )  +......+
        |start()           |join()       2s      |
   s    +------------------+----- ... ----- Ende-+

Der Main-Thread wartet per join() auf die Beendigung von Thread s. Danach wartet der Main-Thread per join() auf die Beendigung von Thread s2 (falls dieser schon beendet ist, wird natürlich nicht gewartet). Dann erfolgt die Zeitmessung.
 

Hag2bard

Bekanntes Mitglied
Ich hab mich gerade nochmal mit der Thematik auseinander gesetzt und festgestellt, dass ich nicht weiter komme.
Ich starte einen neuen Thread mit Hilfe des Runnable Interfaces.
Um die Zeit zu messen benutze ich eine simple Methode die System.currentTimeMillis() zum Start in eine long Variable speichert und zum Ende des Threads wird dann für den jeweiligen Thread genau das selbe in eine jeweilige long Variable getan.
Anschließend zieh ich die Anfangszeiten von den EndZeiten ab.
Damit das funktioniert muss ich allerdings darauf warten, bis beide Threads fertig sind.
Das Problem ist allerdings, dass ich nicht weiß wie. Momentan teste ich 2 verschiedene Primzahl Methoden und habe ein Thread.sleep eingefügt der ausreichend lange wartet um dann erst die benötigte Zeit zu messen.
Ich habe versucht mich in join() einzulesen aber leider durchsuche ich entweder die falschen Quellen oder ich verstehe einfach garnichts von Programmierung.
Man soll die start Methode überschreiben und darin ein join() einfügen.
Aber intellij zeigt mir nicht an, dass ich eine Start Methode überschreiben kann.
 
K

kneitzel

Gast
Also wenn Du zwei Algorithmen vergleichen willst, dann würde ich das nicht in parallelen Threads machen sondern die beiden Algorithmen nacheinander prüfen.

Und Du musst nichts überschreiben. Du rufst in dem Haupt-Thread lediglich auf Deinen Thread Instanzen join auf. Das wäre dann, wenn man es in Deinen Code einbauen würde:
Java:
package de.threads;

import de.threads.Stoppuhr;

public class Main {

    public static void main(String[] args) {
        Stoppuhr s = new Stoppuhr(2000);
        Stoppuhr s2 = new Stoppuhr(2000);
        long st = System.currentTimeMillis();
        s.start();
        s2.start();
        
        // Die Joins
        s.join();
        s2.join();

        long ste = System.currentTimeMillis();
        long f = ste-st;
        System.out.println (f);
    }
}
 

Hag2bard

Bekanntes Mitglied
Nur mal kurz, bevor ich mich euren Aussagen widme:

[CODE lang="java" title="Test-Klasse"]package bankAccount;

import javax.swing.*;

public class Testklasse {


public void testDifference() throws InterruptedException {

Stoppuhr stoppuhr = new Stoppuhr();

Thread vinc = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Vinc start");
for (int i = 0; i < 50000; i++) {
if (primeNumberTest(i)) {
}
}
System.out.println("Vinc fertig!!!!!!!!!!!!!!!!!!!!");
System.out.println("Dauer Vincents Methode: " + stoppuhr.stopMeasuring());

}
});


Thread chris = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Chris start");
for (int i = 0; i < 50000; i++) {
if (isPrim(i)) {
}
}
System.out.println("Chris fertig!!!!!!!!!!!!!");
System.out.println("Dauer Christians Methode: " + stoppuhr.stopMeasuring());
}
});
stoppuhr.startMeasuring();
chris.start();
vinc.start();
Thread.sleep(10000);
}

private boolean isPrim(int number) {
for (int i = 2; i < number - 1; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}


private boolean primeNumberTest(int testNumber) {
boolean isEvenNumber = testNumber % 2 == 0;
if (isEvenNumber) {
return false;
} else {
for (int i = 2; i < testNumber - 1; i++) {
if (testNumber % i == 0) {
return false;
}
}
return true;
}
}


}[/CODE]

[CODE lang="java" title="Stoppuhr-Klasse"]package bankAccount;

public class Stoppuhr {

private long startTime;

public void startMeasuring() {
startTime = System.currentTimeMillis();
}

public long stopMeasuring() {
long endTime = System.currentTimeMillis();
return endTime - this.startTime;
}
}
[/CODE]

edit: Vielen Dank kneitzel, ich verstehe nicht, warum das so einfach nicht im Internet zu finden war.
Jetzt findet man vielleicht dieses Forum
 

mihe7

Top Contributor
In Zeile 42 kannst Du das Thread.sleep() durch chris.join() und vinc.join() ersetzen, dann läufst Du nicht Gefahr, zu kurz oder zu lange zu warten.
 

mihe7

Top Contributor
Nein, aber ich sehe es als best practice an, wenn ich auf einen Thread warten will, dass ich das dann per join und nicht per sleep mache. Er muss hier nicht warten - vorausgesetzt, er hat nicht noch was anderes vor.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7
N Pingen in Threads Java Basics - Anfänger-Themen 9
B Threads benutzen Java Basics - Anfänger-Themen 5
E Allgemein Verständnissfrage zum Ablauf mehrerer Threads Java Basics - Anfänger-Themen 4
S Threads erzeugen Java Basics - Anfänger-Themen 11
K Threads Nur 2 von 3 Threads funktionieren Java Basics - Anfänger-Themen 8
P Threads Methode von Threads erledigen lassen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben