MultiThreading.. Scheduling-Problem?

akimoon

Aktives Mitglied
Hi,

ich hätte ein Problem bezüglich Multithreading. Und zwar erstelle ich 3 Threads, welche "parallel" zur main-Methode abgearbeitet werden sollen. Hierbei tritt nun allerdings das Problem auf, dass scheinbar nur der main-Thread abgearbeitet wird? Ausgegeben wird:
"Main läuft..."
"Main läuft..."
"Main läuft..."
"Main läuft..."
"Main läuft..."

... Soweit ich bisher Multithreading verstanden hatte, sollte der Prozessor zwischen den Threads in Abständen wechseln und somit auch mal "Mein Thread startet..." etc ausgegeben werden, oder hab ich da was falsch verstanden?


Programmstart:
Java:
public class Programmstart {
    public static void main(String[] args) {
        MeinThread t = new MeinThread();
        t.start();

        MeinThread2 t2 = new MeinThread2();
        t2.start();

        Thread r = new Thread(new MeinZweiterThread());
        r.start();

        while(true){
            System.out.println("Main läuft...");
        }
    }
}

MeinThread:
Java:
public class MeinThread extends Thread{

    @Override
    public void run() {
        System.out.println("Mein Thread start.... :-)");
        while(true){
            System.out.println("Mein Thread läuft.... :-)");
        }
    }
}

MeinZweiterThread:
Java:
public class MeinZweiterThread implements Runnable{
    public void run() {
        while(true){
            System.out.println("Mein Runnable läuft....");
        }
    }
}

MeinThread2:
Java:
public class MeinThread2 extends Thread{

    @Override
    public void run() {
        System.out.println("Mein Thread2 start.... :-)");
        while(true){
            System.out.println("Mein Thread2 läuft.... :-)");
        }
    }
}
 
G

Gast2

Gast
Pack mal ein paar Thread.sleep(1000) in die Schleife mit rein...

Ich denke mal du siehst die anderen Outputs einfach nicht.
 

Niki

Top Contributor
ein Thread kann nur laufen wenn er Zeit dafür bekommt. Wenn dein Main Thread immer 100% der CPU in Anspruch nimmt, wird nie ein anderer Thread vom Scheduler Zeit bekommen. Bau mal ein Thread.yield(); in den Threads ein.
 
G

Gast2

Gast
Wenn man das so laufen lässt wird die anderen threads auch zwischendurch immer wieder CPU Zeit gegeben. Zumindest bei mir ;)

Java:
import java.util.Random;

public class Programmstart {
    public static void main(String[] args) {
        MeinThread t = new MeinThread();
        t.start();
 
        MeinThread2 t2 = new MeinThread2();
        t2.start();
 
        Thread r = new Thread(new MeinZweiterThread());
        r.start();
 
        Random rnd = new Random();
        while(true){
        	try {
				Thread.sleep(rnd.nextInt(1000)+1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            System.out.println("Main läuft...");
        }
    }
}

class MeinThread2 extends Thread{
	 
    @Override
    public void run() {
        Random rnd = new Random();
        System.out.println("Mein Thread2 start.... :-)");
        while(true){
        	try {
				Thread.sleep(rnd.nextInt(1000)+1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            System.out.println("Mein Thread2 läuft.... :-)");
        }
    }
}

class MeinZweiterThread implements Runnable{
    public void run() {
    	Random rnd = new Random();
        while(true){
        	try {
				Thread.sleep(rnd.nextInt(1000)+1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            System.out.println("Mein Runnable läuft....");
        }
    }
}

class MeinThread extends Thread{
	 
    @Override
    public void run() {
    	Random rnd = new Random();
        System.out.println("Mein Thread start.... :-)");
        while(true){
        	try {
				Thread.sleep(rnd.nextInt(1000)+1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            System.out.println("Mein Thread läuft.... :-)");
        }
    }
}
 

megalomaniac

Mitglied
Ja, so sollte es eigentlich sein. Kann dein Problem nicht wirklich nachvollziehen, so funktioniert es jedenfalls bei mir problemlos:

Java:
public class ThreadTest {

	public static void main(String[] args) {
        MeinThread t = new ThreadTest().new MeinThread();
        t.start();
 
        while(true){
            System.out.println("Main läuft...");
        }
    }

	public class MeinThread extends Thread {
		@Override
		public void run() {
			System.out.println("Mein Thread start.... :-)");
			while(true){
				System.out.println("Mein Thread läuft.... :-)");
			}
		}
	}
}
 

akimoon

Aktives Mitglied
Niki: Also mit yield() funktioniert es, danke :) Kannst du mir das eventuell auch noch erklären? Komisch ist, wenn ich in der main()-Methode das system.out.println("...") wegnehm, wird auch "Mein Thread läuft... :)" ausgegeben.


Fassy: Bei deinem Code erscheint bei mir nur folgendes auf der Konsole:
Code:
Mein Thread start.... :-)
Mein Thread läuft.... :-)
Mein Thread läuft.... :-)
Mein Thread läuft.... :-)
....

megalomaniac: Das ist ja auch mein Problem, dass es eigentlich funktioneiren sollte =/
Das ganze stammt eigentlich aus einem online-Tutorial..:
YouTube - Java Tutorial - Vom Noob zum SCJP! Teil 30: Multi-Threading Java Tutorial - Vom Noob zum SCJP! Teil 30: Multi-Threading
 
S

SlaterB

Gast
ein Thread kann nur laufen wenn er Zeit dafür bekommt. Wenn dein Main Thread immer 100% der CPU in Anspruch nimmt, wird nie ein anderer Thread vom Scheduler Zeit bekommen. Bau mal ein Thread.yield(); in den Threads ein.
nana, so schlimm ist es auch nicht,
bevor die anderen Threads drankommen, ja überhaupt gestartet sind, kann main in wenigen Millisekunden genug Ausgaben absetzen, um jede Konsole für längere Zeit mit der Anzeige zu beschäftigen,
ob yield() oder nicht ('kann' im Sinne von kann, dass yield() hier hilft habe ich auch grad gelesen),

aber generell kann ein Thread nicht die ganze CPU belegen, es findet alle paar Millisekunden automatisch ein Wechsel statt
 

Niki

Top Contributor
aber generell kann ein Thread nicht die ganze CPU belegen, es findet alle paar Millisekunden automatisch ein Wechsel statt

ich bin mir da nicht 100% sicher ob das so ist (könnte glaub ich auch VM abhängig sein). meiner meinung nach sollte man trotzdem immer im thread selber anderen threads zeit geben auch mal dran zu kommen. Thread.yield(); macht genau das (doku lesen).

//EDIT
hab ein wenig nachgelesen, das könnte das Verhalten erklären:

Thread Scheduling

Siehe Time Slicing
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ein löbliches Kommando, ohne Frage, nur im Standard quasi nicht betrachtet,
da kannst du dir alle einfachen Threads im Internet anschauen,

etwa
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 11.2 Threads erzeugen
das erste Beispiel mit DateCommand + CounterCommand,
läuft durcheinander, ohne yield(), wobei bei mir gerade nicht da eh so schnell,
da muss man schon bisschen mehr Berechnung einbauen

Java:
public class Test {
    public static void main(String[] args)  {
        Thread t1 = new Thread(new DateCommand());
        t1.start();
        Thread t2 = new Thread(new CounterCommand());
        t2.start();
    }
}
class DateCommand  implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++)   {
            System.out.println(new java.util.Date() + " - " + CounterCommand.calc());
        }
    }
}
class CounterCommand  implements Runnable {
    public static double calc()  {
        double x = 2;
        for (int k = 1; k < 3000000; k++)  {
            x += k;
        }
        return x;
    }
    @Override
    public void run()  {
        for (int i = 0; i < 20; i++)   {
            System.out.println(i + " - " + CounterCommand.calc());
        }
    }
}
oder man denke an nebenläuftige Berechnungen zum GUI-Zeichen-Thread

edit:
Your programs should not rely on time slicing because it can produce different results on different systems.
habe ich nun gelesen, ok, man sollte so vieles richtig machen ;)

edit:
auch interessant in der Java-Insel
static void yield()
Der laufende Thread gibt freiwillig seine Rechenzeit ab. Die Methode ist für Implementierungen der JVM nicht verbindlich.
 
Zuletzt bearbeitet von einem Moderator:

Niki

Top Contributor
genau das mein ich. Threading ist generell Umgebungsabhängig. Statt Thread.yield(); kann man auch Thread.sleep(10); verwenden. Das sollte auch bewirken dass andere Threads dran kommen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Multithreading Alphabet Allgemeine Java-Themen 3
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
J Threads Multithreading Allgemeine Java-Themen 15
K Multithreading plattform übergreifend? Allgemeine Java-Themen 3
R Bruteforce hashes mit multithreading. Funktioniert das so? Allgemeine Java-Themen 0
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
C Ressourcensparendes Multithreading Allgemeine Java-Themen 3
A Multithreading mit JButtons Allgemeine Java-Themen 5
S Threads Multithreading- langsamer als Singlethreading-Programm Allgemeine Java-Themen 6
D Threads Multithreading Allgemeine Java-Themen 25
M Multithreading Problem Allgemeine Java-Themen 3
dayaftereh Multithreading Allgemeine Java-Themen 16
E Multithreading and volatile Allgemeine Java-Themen 10
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
G multithreading, concurrency conveyor belt beispiel Allgemeine Java-Themen 2
A Problem mit Zufallszahlen und Multithreading Allgemeine Java-Themen 14
I Problem mit Multithreading Allgemeine Java-Themen 4
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
C Collection Multithreading? Allgemeine Java-Themen 33
O Multithreading mit Java 5 u den Concurrency APIs Allgemeine Java-Themen 7
O Multithreading und Multiprozessor Allgemeine Java-Themen 4
K Multithreading bei statischen Methoden Allgemeine Java-Themen 2
T ungewöhnliche Exception (Multithreading und JList) Allgemeine Java-Themen 10
K Frage zu ProgressBars, Algorithmen und Multithreading ->F Allgemeine Java-Themen 2
flashfactor Multithreading-Problem Allgemeine Java-Themen 4
M priority scheduling in Linux Allgemeine Java-Themen 3
MQue Scheduling Allgemeine Java-Themen 7
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben