Theads Frage

Status
Nicht offen für weitere Antworten.

Johnny00

Mitglied
Hallo liebes Forum,
war schonmal vor langer zeit hier und ich hoffe nun dass ihr mir erneut helfen könnt.

Ich soll 2 Threads erstellen, der eine main thread erstellt nen message thread.
der message thread soll vordefinierte sätze mittels einer for schleife über die interne methode der main klasse auf die konsole printen und anschließend nach der ausgabe einige sekunden warten.
die main methode soll wie gesagt den message thread starten und nach einer gewissen zeit den thread beenden, selbst wenn er noch am laufen ist. zwischendurch sollen main thread und message thread statusmeldungen ausgeben.
bei mir klappt die synchronisation irgendwie nicht. was mich stutzig macht. wenn ich main starte dann gibt erstmal der message thread seine nachrichten aus und dann erst wird ausgegeben das was die main eigentlich zwischendurch ausgeben sollte..

Java:
main.java
public class Main extends Thread
{
    private long maximal = 3000; // ms = 3 Sekunden
    private String myname;

    public Main () {
        this.myname = "main: ";
        this.start();
    }
   
    public void run()
    {
        threadMessage ("Starting MessageLoop thread");
        MessageLoop m = new MessageLoop(this, 0);
        m.start();
        threadMessage ("MessageLoopStarted");
        long start = System.currentTimeMillis();
        do {
            System.out.println ("main: warte auf thread...");
        } while ( System.currentTimeMillis() - start <= maximal ) ;
        
        if (m.isAlive()) {
            m.interrupt();
            threadMessage ("Thread stopped after "+maximal/1000+" seconds");
        }
        else {
            threadMessage ("Thread endes its work..");
        }
    }
    
    public void threadMessage (String message) {
        System.out.println (message);
    }
}

und

Java:
MessageLoop.java
public class MessageLoop extends Thread
{
    // instance variables - replace the example below with your own
    private String   myname = "Thread-";
    private ZahlenGenerator generate = new ZahlenGenerator();
    private Main main;
    private String[] messages = {
        "Dies ist ein Test",
        "Java pr0 !",
        "I`m a Thread",
        "Das ist ein Test 2",
        "Und der Thread läuft immer noch",
        "Unglaublich.. er ist noch am leben!",
        "Bald kommt das Ende..",
        "Angewandte Informatik ist cool..",
        "Ich verstehe nur Bahnhof",
        "Letzte Nachricht!",
    };
    
    public MessageLoop (Main main, int id) {
        this.main   = main;
        this.myname += id;
    }
    
    public void run () {
        for (int i = 0; i < messages.length; i++) {
                main.threadMessage (myname+": message"+i+": "+messages[i]);
                try {
                    sleep ( generate.nextInt ( 1000, 5000 ) ); // 1 - 5 sek
                } catch (InterruptedException e) {
                    // Fehler 
                };
        }
        this.interrupt();
    }
}

die methode nextInt (1000,5000) generiert zufallszahlen 1000 <= x <= 5000.

wäre nett von euch wenn ihr mir helfen könntet das problem zu beheben so dass die threads normal laufen und normale parallele ausgaben tätigen

mfg
johnny
 
Zuletzt bearbeitet:

Johnny00

Mitglied
arg ja stimmt, man bin ich verpeilt der lief ja nicht als ein thread sondern als ein normales objekt, deswegen kam bei isAlive() auch immer false raus.
aber es klappt leider trotzdem nicht.
nun kommt als ausgabe

...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
Thread stopped after 3 seconds
Thread-0: message1: Java pr0 !
Thread-0: message2: I`m a Thread
Thread-0: message3: Das ist ein Test 2
...


//edit
damit ihr wisst was ich miene.. wünschenswert wäre mir so ne ausgabe
main: warte auf thread...
main: warte auf thread...
Thread-0: message1: Java pr0 !
main: warte auf thread...
main: warte auf thread...
Thread-0: message2: I`m a Thread
Thread wurde beendet nach 3 Sekunden

das ist halt nur ein beispiel..
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Dein Thread schläft doch 1-5 Sekunden, während der andere nur 3 Sekunden Busy Waiting betreibt. Mit mehr als einer Nachricht in den 3 Sekunden kannst du also nicht rechnen. 3 ist Maximum, 1 ist Minimum.
 

Johnny00

Mitglied
hm das klingt logisch..
könntest du mir bitte sagen was ich verändern muss damit das klappt?
wäre nett von dir.
hab noch was anderes ausprobiert aber das geht gar nicht..
ich würde gerne sehen wo mein denkfehler ist und wie ich den behebe..
 

Johnny00

Mitglied
Das heißt dann müsste ich praktisch die zeit die der MessageLoop Thread schläft
noch hinzu addieren zu der maxzeit im main thread?
könntest du bitte kurz meinen code ein bisschen verändern damit ich sehe wie du das genau meinst bitte?
 

Johnny00

Mitglied
das löst aber mein problem leider nicht..
das problem dass die threads nicht parallel laufen besteht immernoch :/
wäre nett wenn mir einer helfen könnte weil das wichtig für mich ist
 

Lexi

Bekanntes Mitglied
Generell zu Threads:

Ich finde ist aus OOP Sicht gesehen sinnvoller ein Runnable zu implementieren, als von Thread zu erben, wenn man nicht eine eigene Thread-Klasse schreiben möchte ( ob das überhaupt geht ? ).


1. Eine Klasse die Runnable implementiert und in dessen run Methode der Code drinsteht, der parallel ausgeführt werden soll.
Java:
public class ThreadJob implements Runnable{
     @Oerride
      public void run(){
          //....
      }
}

2.Einen Thread erstellen und ein Object deiner Klasse die Runnable implementiert übergeben. Thread starten.
Java:
Thread myThread = new Thread(new ThreadJob());
myThread.start();

Das kannst du auch mit einer anonymen Klasse lösen, wenn du den "Thread Job" nicht an mehreren Stellen verwenden möchtest:
Java:
Thread myThread = new Thread(new Runnable(){
                                               @Override
                                               public void run(){
                                                    //...
                                               }
                                           });
 

Johnny00

Mitglied
Danke für deine antwort lexi,
ich hab es so probiert wie du gesagt hast und hab ein wenig umstrukturiert:

Java:
public class Start
{
    /**
     * Constructor for objects of class Start
     */
    Thread main, message;
    public Start()
    {
        main = new Thread ( new Main ( this ) );
        message = new Thread ( new MessageLoop (this , 0) );
        threadMessage ("Starting Main thread");
        main.start();
        threadMessage ("Starting MessageLoop thread");
        message.start();
    }
    
    public boolean isAlive () {
        return message.isAlive();
    }
    
    public void interrupt () {
        message.interrupt();
    }

    public void threadMessage (String message) {
        System.out.println (message);
    }
    
    public void sleepMessage (int time) {
        if (isAlive()) {
            try {
                message.sleep (time);
            } catch (InterruptedException e) {};
        }
    }
}

Java:
public class Main implements Runnable
{
    private int maximal = 1 ; // 20 Sekunden
    private String myname;
    private Start start;

    public Main (Start start) {
        this.myname = "main: ";
        this.start = start;
    }
   
    public void run()
    {
        for ( int i = 1; i <= maximal * 100; i++) 
            System.out.println ("main: warte auf thread...");
        start.interrupt ();
    }
    
    public void threadMessage (String message) {
        start.threadMessage (message);
    }
}

Java:
public class MessageLoop implements Runnable
{
    // instance variables - replace the example below with your own
    private String   myname = "Thread-";
    private Start start;
    private String[] messages = {
        "Dies ist ein Test",
        "Java pr0 !",
        "I`m a Thread",
        "Das ist ein Test 2",
        "Und der Thread läuft immer noch",
        "Unglaublich.. er ist noch am leben!",
        "Bald kommt das Ende..",
        "Angewandte Informatik ist cool..",
        "Ich verstehe nur Bahnhof",
        "Letzte Nachricht!",
    };
    
    public MessageLoop (Start start, int id) {
        this.start   = start;
        this.myname += id;
    }
    
    public void run () {
        for (int i = 0; i < messages.length; i++) {
            if (start.isAlive()) {
                start.threadMessage (myname+": message"+i+": "+messages[i]);
                start.sleepMessage ( (int)Math.random() * 1000 );
            }
            else {
                start.interrupt();
            }
        }
        
        if (start.isAlive()) start.interrupt();
    }
}

Also der Code klappt besser als der andere nur nicht leider so wie ich es möchte. Als Ausgabe kommt z.b. heraus:

.....
.....
main: warte auf thread...
main: warte auf thread...
Thread-0: message0: Dies ist ein Test
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
Thread-0: message1: Java pr0 !
Thread-0: message2: I`m a Thread
Thread-0: message3: Das ist ein Test 2
Thread-0: message4: Und der Thread läuft immer noch
Thread-0: message5: Unglaublich.. er ist noch am leben!
Thread-0: message6: Bald kommt das Ende..
Thread-0: message7: Angewandte Informatik ist cool..
Thread-0: message8: Ich verstehe nur Bahnhof
Thread-0: message9: Letzte Nachricht!


Ich versteh es einfach nicht,
das einzige was ich will ist dass diese Threads parallel laufen, dass der main thread auf Thread-0 entweder wartet bis der abgearbeitet ist oder ihn nach einer bestimmten zeit unterbrechen. Statt dessen kommt sowas raus obwohl eigentlich der main thread den Thread-0 hätte stoppen sollen, es kommen aber immer die messages bis 9... ich bin vewirrt :(
 

Johnny00

Mitglied
Noch eine kleine Änderung habe ich getätigt, jetzt weiß ich echt nicht mehr weiter:

Java:
public class MessageLoop implements Runnable
{
    // instance variables - replace the example below with your own
    private String   myname = "Thread-";
    private Start start;
    private String[] messages = {
        "Dies ist ein Test",
        "Java pr0 !",
        "I`m a Thread",
        "Das ist ein Test 2",
        "Und der Thread läuft immer noch",
        "Unglaublich.. er ist noch am leben!",
        "Bald kommt das Ende..",
        "Angewandte Informatik ist cool..",
        "Ich verstehe nur Bahnhof",
        "Letzte Nachricht!",
    };
    
    public MessageLoop (Start start, int id) {
        this.start   = start;
        this.myname += id;
    }
    
    public void run () {
        for (int i = 0; i < messages.length && start.isAlive(); i++) {
            if (start.isAlive()) {
                start.threadMessage (myname+": message"+i+": "+messages[i]);
                start.sleepMessage ( (int)Math.random() * 1000 );
            }
        }
        
        if (start.isAlive()) myinterruption();
    }
    
    public void myinterruption () {
        start.interrupt();
        start.threadMessage ("MessageLoop ended its work...");
    }
}

Java:
public class Main implements Runnable
{
    private int maximal = 3 ; 
    private String myname;
    private Start start;

    public Main (Start start) {
        this.myname = "main: ";
        this.start = start;
    }
   
    public void run()
    {
        for ( int i = 1; i <= maximal * 100; i++) 
            start.threadMessage ("main: warte auf thread...");
            
        if (start.isAlive()) {
            start.interrupt ();
            start.threadMessage ("MessageLoop interrupted...");
        }
    }
}

nun kommt als ausgabe:
...
...
main: warte auf thread...
main: warte auf thread...
Thread-0: message3: Das ist ein Test 2
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
MessageLoop interrupted...
Thread-0: message4: Und der Thread läuft immer noch
Thread-0: message5: Unglaublich.. er ist noch am leben!
Thread-0: message6: Bald kommt das Ende..
Thread-0: message7: Angewandte Informatik ist cool..
Thread-0: message8: Ich verstehe nur Bahnhof
Thread-0: message9: Letzte Nachricht!
MessageLoop ended its work...

Der MessageLoop wurde doch schon vorher gestoppt, wieso läuft der dann noch weiter?
In der for- Schleife überprüf ich EXTRA noch ob der isAlive() zutrifft. Wenn der interrupted wurde dann müsste doch theoretisch FALSE rauskommen?
Ich werde daraus echt nicht schlau, wäre euch SEHR SEHR dankbar wenn ihr mir helfen könntet..
 

Landei

Top Contributor
Ich habe nicht näher hingeguckt, aber kann es sein, dass einfach deine Konsolenausgaben in der falschen Reihenfolge kommen? System.out ist gepuffert, versuch mal ob es mit dem ungepufferten System.err genauso aussieht.
 

Johnny00

Mitglied
Hey landei, ich habs ausprobiert, aber immernoch das gleiche ergebnis:

...
main: warte auf thread...
main: warte auf thread...
main: warte auf thread...
Thread-0: message2: I`m a Thread
main: warte auf thread...
Thread-0: message3: Das ist ein Test 2
main: warte auf thread...
main: warte auf thread...
....
....
...
main: warte auf thread...
MessageLoop interrupted...
Thread-0: message4: Und der Thread läuft immer noch
Thread-0: message5: Unglaublich.. er ist noch am leben!
Thread-0: message6: Bald kommt das Ende..
Thread-0: message7: Angewandte Informatik ist cool..
Thread-0: message8: Ich verstehe nur Bahnhof
Thread-0: message9: Letzte Nachricht!
MessageLoop ended its work...


hat denn wirklich niemand ne lösung für das problem ? ???:L ???:L
 

Marco13

Top Contributor
Hab jetzt auch nur kurz drübergeschaut, aber .. du könntest mal statt "isAlive" schauen, ob du nicht eher "isInterrupted" aufrufen solltest. Bei einem "interrrupt" lebt ein Thread ggf. noch eine Weile weiter (er sollte sich selbst darum kümmern, so schnell wie möglich zu sterben, wenn er interrupted wurde!)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Frage zum Quellcode - Zusammhänge und Ablauf. Java Basics - Anfänger-Themen 2
D Erste Schritte Frage eines absoluten Anfängers Java Basics - Anfänger-Themen 3
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
H Frage zum Array Java Basics - Anfänger-Themen 17
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
B Fachliche Frage bei Rechnungen Java Basics - Anfänger-Themen 16
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben