Threads

javastudent25

Bekanntes Mitglied
Hallo
Zur Einführung habe ich hier ein kleines Programm.
Ich habe dazu 3 Klassen. Die Klasse Thread hat 3 Methoden, start, sleep, run.
Die Anweisungen stehen zwar in der run Methode aber es wird trotzdem irgendwie die start Methode im Main verwendet.
Warum funktiioniert das jetzt nicht?
Eigentlich sollte jetzt ein Plus kommen um zu zeigen, dass die main vorher fertig wird und ich sollte auch sehen, dass sich .*.*.*.*.*.* irgendwie nacheinander wiederholt. Tut es aber nicht.

Java:
public class CharPrinter extends Thread {
    char signal;

    public CharPrinter(char ch) {
        signal = ch;
    }

    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.print(signal);
            int delay = (int) (Math.random() * 1000);
            try {
                sleep(delay);
            } catch (Exception e) {
                return;
            }
        }
    }
}

Java:
public class Thread {
 
public void start() {}
public static void sleep(int milliSeconds) {}
public void run() {
}
}

Java:
class Program {
    public static void main(String[] arg) {
        CharPrinter thread1 = new CharPrinter('.');
        CharPrinter thread2 = new CharPrinter('*');
        thread1.start();
        thread2.start();
        System.out.print('+');
    }
}
 

Blender3D

Top Contributor
+*...*.*.*..**.**..*.*...***.*..*.*..****
Ich habe Deinen Code mal laufen gelassen.
Bei mir kommt zuerst ein +.
Dass sich * und Punkt nicht gleichmäßig abwechseln hängt damit zusammen, dass nicht sichergestellt ist wie die Thread abgearbeitet werden. Damit muss man beim Programmieren mit Threads aber rechenen.
 

javastudent25

Bekanntes Mitglied
Hi danke
Das weiss ich schon, aber wenn ich es laufen lasse, kommt bei mir nur ein plus..
sprich ich führe die main aus, stimmt das
thread1.start() überhaupt.
Denn es gibt ja keine start() Methode
 

Blender3D

Top Contributor
Ich habe Deinen Code laufen lassen, wie gesagt. Die Ausgabe sieht bei mir etwa so aus
+*...*.*.*..**.**..*.*...***.*..*.*..****
Und thread1 hat natürlich die Methode start(), weil es ja vom Type CharPrinter ist der wiederum von Thread abgeleitet ist. Und Thread hat ja bereits die Methoden start() run() usw.
 

Tarrew

Top Contributor
Du solltest deinen CharPrinter schon von dem Java-Thread ableiten. Bei dir passiert nichts, weil du deine eigene Klasse Thread erstellt hast, die halt nichts macht ;)
 

javastudent25

Bekanntes Mitglied
Es gibt ja da die run-Methode. Wie mache ich das jetzt zB, dass nicht alles in der run-Methode ist?
Was ich meine ist, was passiert, wenn ich eine andere Methode noch erstellen möchte im CharPrinter?
So wie ich das verstehe, kann ich das ja nur in run implementieren und danach dann in der main mit start() starten..
In meinen Augen ist das irgendwie unflexibel, aber das mein ich vielleicht nur, weil ich keine Ahnung habe oder? :)
 

Tarrew

Top Contributor
Eigentlich ist es auch 'sauberer' Runnable zu implementieren aber das nur nebenbei ; )

#Edit: Du kannst aus der run() Methode ja andere Methoden aufrufen.
 

javastudent25

Bekanntes Mitglied
ok, das heisst also, ich müsste den ganzen Code oder die ganzen Anweisungen alle in run implementieren und daraus dann eben einfach auf all die Methoden zugreifen.

Was meintest du mit Runnable?
Anstatt extends Thread
extends Runnable und warum?
 

Tarrew

Top Contributor
Das hast du ja in jedem Programm. Genauso hast du ja nur eine main-Methode und musst daraus alles aufrufen.

Du hast den Vorteil dass du mehrere Interfaces implementieren kannst und wenn du Runnable implementierst kannst du außerdem noch von einer Klasse erben. Wenn du von Thread erbst geht das nicht mehr, da Mehrfachvererbung in Java nicht möglich ist.
Bietet sich außerdem an wenn du später nochmal mit sowas wie ThreadPools und FutureTasks arbeiten willst.
Rein von der Logik her möchtest du ja auch nur eine ausführbare Aufgabe übergeben und nicht irgendein threadspezifisches Verhalten ändern.

Mit Runnable wäre das dann so:
Java:
class Program {
    public static void main(String[] arg) {
        CharPrinter thread1 = new CharPrinter('.');
        CharPrinter thread2 = new CharPrinter('*');
        new Thread(thread1).start();
        new Thread(thread2).start();
        System.out.print('+');
    }
}
Java:
public class CharPrinter implements Runnable {
    char signal;

    public CharPrinter(char ch) {
        signal = ch;
    }

    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.print(signal);
            int delay = (int) (Math.random() * 1000);
            try {
                Thread.sleep(delay);
            } catch (Exception e) {
                return;
            }
        }
    }
  
}
 

javastudent25

Bekanntes Mitglied
Vielen Dank

Ich habe hier eine Klasse, die threadsicher gemacht werden soll.
Dafür müsste man synchronized verwenden, damit sich die Threads nicht in die Quere kommen.
Reicht es in diesem Fall einfach synchronized Methoden daraus zu machen?

aus

Java:
public class Stack {
private Object[] array;
private int index;
Stack(int size) {
array = new Object[size];
}
public void put(Object o) {
if (index<array.length) {
array[index] = o;
index = index + 1;
}
}
public Object get() {
if (index==0) return null;
Object o = array[index];
index = index - 1;
return o;
}
}

wird

Java:
public class Stack {
private Object[] array;
private int index;
Stack(int size) {
array = new Object[size];
}
public synchronized void put(Object o) {
if (index<array.length) {
array[index] = o;
index = index + 1;
}
}
public synchronized Object get() {
if (index==0) return null;
Object o = array[index];
index = index - 1;
return o;
}
}
 
Zuletzt bearbeitet:

javastudent25

Bekanntes Mitglied
Wie funktioniert das mit dem synchronized (lock) eigentlich?
Und wie müsste ich dies hier machen?
Das kann ich hier aus dem Text irgendwie nicht ganz herausfiltern.
 

Tarrew

Top Contributor
Threas1 holt sich praktisch den 'Lock' an dem Objekt. Wenn Thread2 an die Stelle kommt und versucht sich auch den Lock zu holen, geht das nicht weil Thread1 diesen noch hat. Er wartet also so lange bis Thread1 den Block verlässt und den Lock freigibt. Danach holt sich Thread2 den Lock und kann den Block ausführen.

Wenn eine Methode synchronized ist, wird implizit einfach ein Lock auf das this-Objekt gemacht. Folgende Source-Codes verhalten sich also gleich:
Java:
    public synchronized Object get() {
        if (index == 0)
            return null;
        Object o = array[index];
        index = index - 1;
        return o;
    }
Java:
    public Object get() {
        synchronized (this) {
            if (index == 0)
                return null;
            Object o = array[index];
            index = index - 1;
            return o;
        }
    }

In diesem Fall könntest du dich aber auch zum Beispiel an dem Array synchronisieren.
 

javastudent25

Bekanntes Mitglied
danke, aber das verstehe ich nicht, wieso an dem Array? Und warum kann man das an einem Array.
Genauso könnte ich ja auch sagen, na dann machen wir es doch am Index?!
 

Tarrew

Top Contributor
Man kann sich an jedem Objekt synchronisieren ;)

Und das kann durchaus sinnvoll sein. Wenn du Ressource A und Ressource B hast und zwei Threads dann ist es nicht unbedingt sinnvoll sich am this Objekt zu synchronisieren.
Wenn Thread1 nur etwas mit A machen will, dann muss Thread2 warten obwohl er mit Ressource B etwas machen könnte.
Bei sowas ist es dann sinnvoller sich an A bzw. B zu synchronisieren.
Ist aber von Fall zu Fall unterschiedlich und man muss immer mit Race Conditions und Deadlocks aufpassen.
 

javastudent25

Bekanntes Mitglied
Ich habe mich mal inzwischen an einem Beispiel versucht, was irgendwie immer noch nicht hinhaut.

Gesucht ist eine Klasse Terminator. Ein „Terminator“ zählt im Sekundentakt von 10 nach 0. Anschliessend beendet er mit System.exit(1) brutal die laufende Applikation. a) Implementieren Sie die Klasse, so dass sie mit dem untenstehenden Code zusammen funktioniert.

Java:
public class TerminatorDemo {
public static void main(String[] args) {
Terminator t = new Terminator();
t.start();
while (true) {} } }

b) Ergänzen Sie die Klasse um eine Methode disable(), so dass ein „Terminator“ auch abgebrochen werden kann.

Lösung:

Java:
import java.util.concurrent.TimeUnit;

public class Terminator implements Runnable{
 
    private int i = 10;
    private int time;
 
    Terminator(int time){
        this.time = time;
    }

    public void run(){
     
        System.out.println(i);
        try {
            TimeUnit.MILLISECONDS.sleep(time);
        } catch (InterruptedException e) {
         
            e.printStackTrace();
        }
        if(i == 0){
            disable();
        }
        i--;
     
        }

 
    public void disable(){
        System.exit(1);
    }
     
 
}

Java:
public class TerminatorDemo {

    public static void main(String[] args) {
        Terminator t = new Terminator(1000);
         t.start();
        while (true) {
         
        }

    }

}

er meckert irgendwie an dem t.start();
und wofür ist die while??
 

Tarrew

Top Contributor
Du musst einen neuen Thread erstellen und dem das Runnable übergeben. An dem Thread Objekt kannst du dann start aufrufen.

Die while-Schleife in der TerminatorDemo Klasse macht garnichts und ist sinnlos. Hält nur den main-Thread am Leben aber das wars.

In deiner run-Methode fehlt die Schleife damit du auch mehrmals runterzählst.
 

javastudent25

Bekanntes Mitglied
Hey vielen Dank ;)

Java:
public class TerminatorDemo {

    public static void main(String[] args){
        Terminator t = new Terminator(1000);
        Thread object = new Thread(t);
        object.start();
    

    }

}

Java:
import java.util.concurrent.TimeUnit;

public class Terminator implements Runnable{

    private int i = 10;
    private int time;

    Terminator(int time) {
        this.time = time;
    }

    public void run(){

        while (i >= 0) {
            System.out.println(i);
            try {
                TimeUnit.MILLISECONDS.sleep(time);
            } catch (InterruptedException e) {
            
                e.printStackTrace();
            }
            if (i == 0) {
                disable();
            }
            i--;

        }
    }

    public void disable() {
        System.exit(1);
    }



}
 
Zuletzt bearbeitet:

Tarrew

Top Contributor
Wird nicht so richtig deutlich aus der Aufgabenstellung.

Aber bei b) geht es glaub ich darum nur den Thread zu beenden und nicht die gesamte Applikation.
 

javastudent25

Bekanntes Mitglied
mit welchem Befehl mache ich das denn?
und wie macht man das zur Laufzeit?
Baue ich da was Fixes in die main oder passiert das mit Tastenkombination von aussen?
 

javastudent25

Bekanntes Mitglied
Also ich hab das grad mal versucht, aber irgendwie kommt eine NullPointer
und bis dann aber disable() ausgeführt wird, wird ja zuerst mal runtergezählt..
Wie soll das denn gehen, dass ich den Thread während der Laufzeit abbrechen kann..?
Java:
public class TerminatorDemo {
        static Thread object;
    public static void main(String[] args) {
        Terminator t = new Terminator(1000);
        Thread object = new Thread(t);
        object.start();
        disable();
    }
   
    public static void disable(){
            object.stop();
       
    }

}
 

Tarrew

Top Contributor
Kein Thread.stop() benutzen ;)

Mach in deiner run() sowas wie:
boolean run=true;
while(run){
//...
}

Den Thread stoppst du dann indem du run auf false setzt.
 

javastudent25

Bekanntes Mitglied
Wenn ich nur deinen Kopf hätte ;)

Java:
public class TerminatorDemo {
        static Thread object;
    public static void main(String[] args) {
        Terminator t = new Terminator(1000);
        Thread object = new Thread(t);
        object.start();
       
    }

}


Java:
import java.util.concurrent.TimeUnit;

public class Terminator implements Runnable{

    private int i = 10;
    private int time;
    boolean run = true;

    Terminator(int time) {
        this.time = time;
    }

    public void run(){

        while (run & i >= 0) {
            System.out.println(i);
            try {
                TimeUnit.MILLISECONDS.sleep(time);
            } catch (InterruptedException e) {
               
                e.printStackTrace();
            }
            if (i == 0) {
                exit();
            }
            i--;
           
            if (i==6){
                disable();
            }

        }
    }

    public void exit() {
        System.exit(1);
    }
   
    public void disable(){
        run = false;
    }

}
 

javastudent25

Bekanntes Mitglied
ok, das eine ist bitweises und das andere ist logisch UND, ;) danke für alles
ich werde morgen und vielleicht heute auch noch 1-2 Beispiele dazu machen.
 

javastudent25

Bekanntes Mitglied
Soo, ich war doch ein wenig fleissig und hab da was gebastelt.
Warum funktioniert das nun, mit

TimeUnit.MILLISECONDS.sleep(delay);

aber nicht mit

sleep(delay);

Java:
public class test {

    public static void main(String[] args) {
    
     
        CharPrinter2 t1 = new CharPrinter2();
        Thread object1 = new Thread(t1);
        object1.start();
    

    }

}

Java:
import java.util.concurrent.TimeUnit;

public class CharPrinter2 implements Runnable {
    String signal;
    int delay = 1000;

    public CharPrinter2() {
    
    }

    public void run() {
    
        CharReader t2 = new CharReader();
        Thread charreader = new Thread(t2);
        charreader.start();
        signal = t2.getSignal();
    
        for (int i = 0; i < 100; i++) {
        
        
            try {
                System.out.print(signal);
                signal = t2.getSignal();
                TimeUnit.MILLISECONDS.sleep(delay);
            } catch (Exception e) {
                return;
            }
        }
    }
}


Java:
import java.util.Scanner;

public class CharReader implements Runnable {

    private String signal = "AudiRS4";

    public CharReader() {
    
    }

    public void run() {
    
       while(true){
        Scanner sc = new Scanner(System.in);
        System.out.println("Zeichen?");
        signal = sc.nextLine();
       }
    
    }

    public String getSignal(){
        return signal;
    }
}
 
Zuletzt bearbeitet:
Ä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
H Threads Anfänger Java Basics - Anfänger-Themen 17
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
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