Fragen zum Thread-Thema

tanechka

Bekanntes Mitglied
Hallo,

ich habe fragen zur Console-Ausgabe. Ich habe folgendes Programm:
Code:
public class XMapp implements Runnable{

	  static String s="ABC";

	  public void run(){
	    synchronized(this){
	      System.out.print(s);
	    }
	  }

	  public static void main(String args[])throws Exception{
	    Thread td=new Thread(new XMapp());
	    synchronized(td){
	      td.start();
	      //Thread.sleep(1000);
	      s="XYZ";
	    }
	  }

	}

Wenn ich die Zeile Thread.sleep(1000);also main-Thread schlafe für eine Sekunde auskommentiere, habe ich die Ausgabe "XYZ", sonst "ABC". Wie soll man das verstehen? Die Zeile mit td.start() ist doch davor und Thread td sollte den alten Wert "ABC" ausgeben müssen?
 

Phash

Top Contributor
der Thread geht in den Hintergrund

wenn er nicht schläft, dann ist er schnell genug, um vor dem system.out wieder da zu sein, und die Variable ist schon umgesetzt
wenn er schläft, ist system.out schneller und die Variable noch nicht gesetzt


Teste das ganze mal, indem du dir s an verschiedenen Stellen ausgeben lässt - einmal vor dem Thread aufruf, einmal vor dem Schlafen und einmal nach dem Schlafen (markiere die Ausgabestellen aber)

dann wirst du es merken
 

kaoZ

Top Contributor
Du startest den Thread, dieser führt nach dem aufruf von start() sein runnable aus, und wird dann schlafen gelegt, heißt , erst wird "ABC" ausgegeben, dann wird der Thread schlafen geschickt, dann wird der Referenz ein neues String Objekt zugewiesen, usw. usw.

wenn du nun das auskommentierst, wird der Referenz direkt ein neues Objekt zugewiesen und demnach auch gleich "XYZ"
ausgegeben bevor die Ausgabe erfolgt, da dies anscheinend schneller passiert , als die ausgabe über den printStream.
 
Zuletzt bearbeitet:

Phash

Top Contributor
Java:
package de.mr.krams;

public class XMapp implements Runnable {

    static String s = "ABC";

    @Override
    public void run() {
	System.out.println("1+" + s);
	synchronized (this) {
	    System.out.println("2+" + s);
	}
	System.out.println("3+" + s);
    }

    public static void main(String args[]) throws Exception {
	System.out.println("4+" + s);
	Thread td = new Thread(new XMapp());
	synchronized (td) {
	    td.start();
	    System.out.println("5+" + s);
	    Thread.sleep(1000);
	    s = "XYZ";
	    System.out.println("6+" + s);
	}
    }

}

hier kannst du es auf der Konsole schön verfolgen :)
 
Zuletzt bearbeitet:

Network

Top Contributor
Deine synchronized sind aber auch ganz schön wahllos mal im Code verteilt worden, kann das sein? :D
Aber huer kommst du auf ein interessantes Thema zu sprechen und zwar Multithreading. Du kannst nie vorhersagen was zuerst passieren wird oder in welcher Reihenfolge. Daran solltest du dich gewöhnen wenn du Multithreading anwenden willst (so wie es scheint), denn genau das ist die gesammte Problematik hinter Multicore und warum viele Spiele z.B. nie alle Kerne nutzen.

In deinem Fall kann ich nicht sagen an was es liegt.
Meine erste Vermutung wäre das du mal versuchen solltest "synchronized (td)" zu entfernen. Das blockt eventuell den neu erstellten Thread td, weshalb sich Thread.sleep (1000) auch darauf auswirken könnte.
Entferne das mal (ist vollkommen unnötig) und schaue was passiert.
 

tanechka

Bekanntes Mitglied
ich habe so verstanden Thread.sleep(1000);- ist hier main-Thread gemeint? Liege ich falsch?
Wenn ich Phash dein Programm ausführe kriege ich folgende Ausgabe:
4+ABC
5+ABC
1+ABC
2+ABC
3+ABC
6+XYZ

beim run() hat man immer noch altes Wert. Ich würde bei meinem Programm auch altes Wert erwarten.
 

kaoZ

Top Contributor
Andere Frage , warum erstellst du nicht innerhalb deines Objektes den Thread der dann sein Runnable ausführt ?

Das hier wäre ein Vorschlag, außer es ging dir nur darum warum es so ist, ebenso könntest du natürlich auch gleich die "Wartezeit", im Konstruktor übergeben, wie gesagt ist nur ein Vorschlag :

Java:
public class ThreadExample implements Runnable{

	private String s = "ABC";
	
	public ThreadExample(){
		Thread t = new Thread(this);
		t.start();
	}
	
	public ThreadExample(String s){
		Thread t = new Thread(this);
		this.s = s;
		t.start();
	}
	
	
	@Override
	public void run(){
		System.out.println(s);
		
		try {
			Thread.sleep(1000);
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	public static void main(String[] args){
		new ThreadExample("XYZ");
		new ThreadExample();
	}

}

insofern dein Runnable nicht in einer Schleife ausgeführt wird kannst du nach dem Thread.sleep der Variable so oft du willst ein neues Literal zuweisen, hat aber keinen Effekt , da das Runnable , in deinem Fall das ausgeben des String literals bereits passiert ist nachdem du den Thread gestartet hast und ihn danach erst schlafen schickst, wenn du das Thread.sleep auskommentierst, wird das Runnable ausgeführt, deiner variable direkt das neue literal zugewiesen und erst dann geprintet, das liegt hier wie bereits schon erwähnt daran das du keinen Einfluss darauf hast, wie und wann der Thread sein Runnable ausführt und du mit .start() lediglich das flag setzt, ebenso ähnlich ist es beim Beenden eines Threads mit .interrupt() , außer wenn du den Thread mitten in seiner Ausführung komplett abwürgst.
 
Zuletzt bearbeitet:

tanechka

Bekanntes Mitglied
mir geht es darum, wieso es so ist. Auch wenn ich dein run() als synchronized definiere. Wechselt sich die Ausgabe: mal
XYZ
ABC

mal:

ABC
XYZ

obwohl die Reihenfolge im main() definiert ist:
new ThreadExample("XYZ");
new ThreadExample();
 

kaoZ

Top Contributor
Das liegt , wie oben schon mehrfach erwähnt wurde daran, das du keinen Einfluss darauf hast , wann der Thread gestartet, bzw. welcher Thread sein Runnable zuerst ausführt, und noch von unzähligen anderen Faktoren.

ansonsten versuch doch mal run() direkt aufzurufen, und nicht start(), beim Aufruf von run() wird sequentiell nacheinander ausgeführt, beim Aufruf von start() , wie bei Threads gewünscht Parallel.

Hier z.B sollte die Ausgabe immer A B sein da hier Sequentiell ausgeführt wird, also erst das runnable der klasse ThreadA dann das der Klasse ThreadB

Java:
public class Bar{

	class ThreadA implements Runnable{

		
		public ThreadA(){
			new Thread(this).run();
		}
		
		@Override
		public void run(){
			
			System.out.println("A");
		}
		
	}
	
	class ThreadB implements Runnable{

		
		public ThreadB(){
			new Thread(this).run();
		}
		
		@Override
		public void run(){
			
			System.out.println("B");
		}
		
	}
	
	public static void main(String[] args){
		new Bar().new ThreadA();
		new Bar().new ThreadB();
	}
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
E Thread Fragen in Verbindung mit Swing Allgemeine Java-Themen 4
Zrebna Fragen zu Testabdeckungs-Metriken Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
K BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren) Allgemeine Java-Themen 141
V Ich hätte 2 Fragen Allgemeine Java-Themen 5
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
H Fragen zur Kraken Api Allgemeine Java-Themen 1
nonickatall Klassen Grundsätzliche Fragen zu geplanter Programmstruktur Allgemeine Java-Themen 5
W Ein paar Fragen zu .properties und .css Allgemeine Java-Themen 6
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
X Fragen zur Javamail API und Gmail Allgemeine Java-Themen 4
T Fragen bezgl. Lambdas Allgemeine Java-Themen 20
X Collections Fragen zu gleichen Elementen in TreeSet Allgemeine Java-Themen 35
A Neuerungen in Java 8 StreamAPI- Paar fragen Allgemeine Java-Themen 4
temi Fragen zur Software-Architektur Allgemeine Java-Themen 123
M Diverse Design-Fragen Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
M Fragen beantworten über Textfeldeingabe Allgemeine Java-Themen 5
D Grundsätzliche Fragen zum Heap Space Allgemeine Java-Themen 12
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
M Allgemeine Fragen meinerseits Allgemeine Java-Themen 4
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
R Es gibt keine dummen Fragen (hab ich mal gehört) Allgemeine Java-Themen 11
2 2 Klein Fragen Allgemeine Java-Themen 7
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
A Java Theorie-Fragen Allgemeine Java-Themen 7
K Java QUIZ-Spiel Fragen und Antworten generieren?! Allgemeine Java-Themen 5
R Socket Fragen zu UDP Allgemeine Java-Themen 1
B Noob-Fragen zu Tablets und PC kompatiblität... Allgemeine Java-Themen 6
D Ein paar allgemeine Fragen zu Java Allgemeine Java-Themen 19
L Fragen für Facharbeit: Analyse von Strings in Java Allgemeine Java-Themen 4
R Fragen zu Server + UI Allgemeine Java-Themen 2
U Vier Fragen zu Java Allgemeine Java-Themen 2
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
D Fragen zum erstellen einer ausführbaren Jar Datei Allgemeine Java-Themen 3
C Polymorphie Fragen zur Annotations von Persistenz Allgemeine Java-Themen 2
O Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI Allgemeine Java-Themen 7
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
Luk10 Fragen zum ByteBuffer (lwjgl - icons) Allgemeine Java-Themen 2
F Akkumulator Hough-Transformation offene Fragen Allgemeine Java-Themen 4
Luk10 Fragen zu Naming-Conventions Allgemeine Java-Themen 5
Z Einige Fragen Allgemeine Java-Themen 10
T OOP Einige Fragen zu UML-Klassendiagrammen Allgemeine Java-Themen 6
G Einige Fragen zu ResourceBundles Allgemeine Java-Themen 2
S Fragen zu verschiedenen Themen vom JCreator Allgemeine Java-Themen 2
DStrohma Grundsätzliche Fragen zum Aufbau eines komplexeren Programmes Allgemeine Java-Themen 8
Semox Grapheneditor - Allgemeine Fragen zum Logikdesign Allgemeine Java-Themen 3
O kleine Fragen eines Anfängers Allgemeine Java-Themen 2
X Executor fragen ob fertig Allgemeine Java-Themen 13
nrg Swing 2 Fragen zu Swing/AWT Allgemeine Java-Themen 7
K Reflections Fragen Allgemeine Java-Themen 7
S Fragen zum SCJD-Zertifikat Allgemeine Java-Themen 2
M Backend Entwicklung - Konzept fragen Allgemeine Java-Themen 3
E Fragen zu Scala Allgemeine Java-Themen 11
Daniel_L Fragen zu RegEx und URL umwandeln Allgemeine Java-Themen 4
J Diverse Fragen bezüglich Jasper Allgemeine Java-Themen 3
S Fragen zum ShutdownHook Allgemeine Java-Themen 7
V Fragen zu einem Java Browser Allgemeine Java-Themen 7
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
M Drag and Drop: 3 Fragen Allgemeine Java-Themen 3
L Einige Fragen zu Java Allgemeine Java-Themen 9
F Linguistische Fragen zu Javadoc bzw. Englisch Allgemeine Java-Themen 4
E Einfache Fragen zu Dateien Allgemeine Java-Themen 7
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
H Java Multiplicoice Test (10 Fragen) Allgemeine Java-Themen 11
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
D Grundsätzliche Fragen zur Grafikdarstellung in Spielen Allgemeine Java-Themen 2
J 2 Fragen zu JMF und eine Rechtsfrage Allgemeine Java-Themen 3
S Viele Fragen eines Umsteigers (von .NET) Allgemeine Java-Themen 6
C LinkedList Fragen Allgemeine Java-Themen 7
P Fragen zur JBuilder und den kosten. Allgemeine Java-Themen 7
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
I Fragen zum Internetseiten Einlesen/Auswerten Allgemeine Java-Themen 5
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
S 2 Fragen allgemeine fragen zu final und interface Allgemeine Java-Themen 13
M ein paar fragen über JBoss und Catalina Allgemeine Java-Themen 7
D Allgemeine Fragen zum Speichern Allgemeine Java-Themen 3
F allgemeine Fragen zu Java Allgemeine Java-Themen 9
S Fragen zu 4 speziellen Listen Allgemeine Java-Themen 4
U JFrame, JOptionPane - vor dem Schließen Benutzer fragen Allgemeine Java-Themen 10
I zwei simple fragen Allgemeine Java-Themen 22
G 2 Fragen Allgemeine Java-Themen 7
G Fragen zu ausführbaren JAR Files Allgemeine Java-Themen 23
G Fragen zu JTextField bzw. JTextArea Allgemeine Java-Themen 2
J 5 Fragen. Allgemeine Java-Themen 2
P Tausend Fragen... Allgemeine Java-Themen 3
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
smarterToby Wie stoppe ich diesen Thread Allgemeine Java-Themen 4
A Thread.sleep Problem Allgemeine Java-Themen 2
J Thread started nur einmal Allgemeine Java-Themen 19
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben