nach thread.run() fortsetzen

Status
Nicht offen für weitere Antworten.

Feld

Mitglied
Hi

Ich hab gerade ein Problem mit Thread, und zwar wenn ich die Methode run() aufrufe, dann ist der ganze nachfolge Code nicht mehr erreichbar.

Keine Ahnung wieso, aber ich hatte zuvor nie ein Problem damit - ist erst jetzt aufgefallen. Ich habe hier ein kelines Beispiel geschrieben um das Problem zu verdeutlichen, schaut mal einer pls an

Java:
public class RunableClass implements Runnable
{
	private Thread t;
	private ArrayList < Integer > ar;
	private Integer i;
	private int count;
	
	public RunableClass ( )
	{
		t = new Thread ( this );
		ar = new ArrayList < Integer > ( );
		count = 0;
	}
	
//sinnloses run der ewig weiter geht
	@Override public void run ( )
	{
		while ( t != null )
		{
			i = new Integer ( count++ );
			ar.add ( i );
			for ( Integer integer : ar )
			{
				System.out.print ( integer.toString ( ) + ", " );
			}
			System.out.println ( );
			try
			{
				Thread.sleep ( 1000 ); //dazu die 2te frage
			} catch ( InterruptedException e )
			{ }
		}
	}

}

Dann starte ich die Klasse
Java:
public class RunC
{
	public static void main ( String[] args )
	{
		RunableClass r = new RunableClass ( );
		r.run ( );
		System.out.println ( "nach run" );
	}
	
}

Und jetzt Hauptfrage:
Wie komme ich bis Zeile ohne den Thread zu beenden?
Code:
System.out.println ( "nach run" );

Der hängt wahrscheinlich in der
Code:
while ( t != null )
Schleife drin, sodass er nicht mehr weiter kommt ... Aber sind threads nicht dafür da das die Parallel ablaufen?

Die Klasse Thread an der Stelle von Runnable kann ich nicht verwenden, da die Klasse von Observable erben soll.

Im Original starte ich GUI mit
Java:
SwingUtilities.invokeLater( new Runnable ( ) ... bla bla
und dann soll es parallel mit anderen Thread ( 2-4 Stück ) parallel laufen

Übrigens wenn ich schon dabei bin - eine Sache habe ich nie verstanden - wenn ich in irgendeinem Thread schreibe
Code:
Thread.sleep(xxxx);
ist es dann nur für den Thread gültig in welchen ich das reingeschrieben habe oder für alle laufende Threads oder überhaupt für irgendeinen zufälligen Thread? Weil ich hatte mal richtig probleme mit einem Thread der ziemlich schnell lief obwohl der nur alle X sekunden 1 mal starten sollte - als ich dann
Code:
threadName.sleep(xxxx);
schrieb erst dann hat er wirklich die Zeit abgewartet. -Weiß es einer zufällig?
 

oversoul

Aktives Mitglied
Mein erster Post hier :D

Beim arbeiten mit der Klasse Thread must du, um den Thread zu starten nicht die run()-Methode aufrufen, sondern die start()-Methode

Da haste woll run() mit start() vertauscht

Aber das Überschreiben der der run Methode war richtig
 
S

Spacerat

Gast
Nee, nee, nee, nee...
Die Run-Methode wird niemals direkt aufgerufen. Stattdessen instanziert man einen Thread (ggf. mit einem Runnable) und ruft auf dem entstehenden Objekt die Methode start() auf.
Java:
class RunnableClass
implements Runnable
{
  @Override
  public void run()
  {
    //...do Threadworks
  }
}

public class ThreadTest
{
  public static void main(String ... args)
  {
    Thread t = new Thread(new RunnableClass());
    t.start();
  }
}
Soweit in groben Zügen.
 

Feld

Mitglied
cool, es geht :)

Weißt du zufällig auch auf welchen Thread sich das Thread.sleep() bezieht? weil wie oben beschrieben ist es nicht zwangsläufig der Thread wo es drin steht
 
S

Spacerat

Gast
!!!ACHTUNG FALLE!!! die Sleep-Methode sollte stets auf der Klasse Thread ausgeführt werden (static). Damit wird der aktuell bearbeitete Thread vorübergehend angehalten. Die Methode ist in etwa äquivalent zu Thread.currentThread().wait(long timemillis). Innerhalb der Run-Methode eines Threads empfiehlt es sich deswegen statt Thread.sleep() folgendes zu verwenden:
Java:
synchronized(this) {
  try {
    this.wait((long) timemillis);
  } catch(InteruptedException ie) {
    this.interrupt(); // interrupt() widerholen... scheint wichtig
  }
}
Für Runnables muss this gegen den Variablennamen jenes Threads ausgetauscht werden, welcher mit diesem Runnable instanziert wurde.
@oversoul: die Methode "sleep()" erwartet ein long ;)
 

Feld

Mitglied
Das habe ich auch so gelesen - aber wie gesagt - ich hatte heit ein mainThread, der startete ein 2es thread der alle 10 sek sollte was machen - dafür schrieb ich Thread.sleep ( 10000 ); Die Sache war das kein Thread 10 sek lang schlief, sondern beide liefen weiter. Erst als ich nebenThreadName.sleep schrieb wurde der nebenthread für 10 sek pausiert.

Deswegen ist mir unklar auf was sich das Thread.sleep bezieht in so einem Fall
 

oversoul

Aktives Mitglied
Hmm ich weiß nicht ob du das möchtest aber es gibt noch die Enumeration (oder Klasse?) TimeUnit aus dem Paket java.util.concurrent, damit lassen sich (meiner Meinung nach) einfach Verzögerungen erstellen.

Ein kleines Beispiel:

Java:
import java.util.concurrent.TimeUnit;


public class test {
	
	public static void main(String[] args) throws InterruptedException {
		
		System.out.println("Ich schlaffe gleich 2 Minuten lang");
		TimeUnit.MINUTES.sleep(2);
		
		System.out.println("2 Minuten vorbei ich mache weiter :D");	
	}

}

Ich finde diese Methode sehr praktisch vorallem finde ich sowas etwas leichter zu lesen(persönliche Meinung)
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Wie gesagt: Ist 'ne Falle. Mir ist zwar unklar, wieso das so geklappt hat, aber der Name einer Instanzvariablen hat vor statischen Methoden, nicht nur bei Thread.sleep(), sondern allgemein, nichts verloren. Thread.sleep() ausserhalb einer Run-Methode zu verwenden macht ohnehin auch irgendwie keinen Sinn, es sei denn, man möchte den Main-Thread pausieren. Innerhalb einer solchen ist dann auch klar, welcher Thread gerade current ist. Damit ist Thread.sleep() nichts weiter, als die Abkürzung zu dem Code aus meinem 2. Beitrag. Das alles macht Thread.sleep() prinzipiell so nützlich wie'n Buckel. Der Abschnitt mit dem wait() ist zwar länger, aber dafür durchsichtiger und mehr OOP-Konform, weil ohne statischen Kontext. Versuch' mal, dir vorzustellen, Thread.sleep() würde es nicht geben. Welches Problem hättest du dann nicht? EXACTLY... Es wäre dir nicht mehr unklar, auf welchen Thread es sich bezieht.
 
Zuletzt bearbeitet von einem Moderator:

Feld

Mitglied
Ja, das mit synchronized ( this ) ist richtig schön - habe gerade ausprobiert, Danke
Natürlich hatte ich die sleep() methode in run() verwendet, damals waren überhaupt sachen passiert die ich nur mit magie erklären konnte - das gleiche Javaprogramm ist auf unterschiedlichen Rechnern mit gleiche nBetriebssystem unterschiedlich gelaufen !

btw Hast ein "r" zu wenig in InterruptedException xD

Interessant, was passiert bei synchronized ( this ) ?
 

oversoul

Aktives Mitglied
synchronized ( this ) { INHALT}

Sollte, wenn ich mich nicht irre (hab erst seit 6 Monaten mit Java angefangen und kann noch nicht alles aus den ff) bewirken, dass nur ein Thread gleichzeitig den inhalt ausführen kann, alle anderen Threads müssen warten
 
S

Spacerat

Gast
,,, gleiche nBetriebssystem unterschiedlich gelaufen !

btw Hast ein "r" zu wenig in InterruptedException xD
Tja... Fehler passieren...:D
synchronized ( this ) { INHALT}

Sollte, wenn ich mich nicht irre (hab erst seit 6 Monaten mit Java angefangen und kann noch nicht alles aus den ff) bewirken, dass nur ein Thread gleichzeitig den inhalt ausführen kann, alle anderen Threads müssen warten
Jepp. 1. Dass und 2. Mit synchronized holt man sich den Monitor des Threads. Das ist für den Aufruf von wait und notify Methoden notwendig und wirkt einer IllegalMonitorStateException (odr so ähnlich) entgegen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
W Threads nach Thread Ende Variablen auslesen Java Basics - Anfänger-Themen 2
S Erste Schritte Suche nach einem guten JAVA-Buch (Definition im Thread) Java Basics - Anfänger-Themen 6
K Thread nach X-Sekunden beenden Java Basics - Anfänger-Themen 6
G nach Thread.start(); nochmal start(); aufrufen geht nicht Java Basics - Anfänger-Themen 4
S Thread nach Beenden erneut starten Java Basics - Anfänger-Themen 2
F Thread nach unaktivitätszeit stoppen Java Basics - Anfänger-Themen 7
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
W LocalDate toString und nach Split falsch "erkannt"? Java Basics - Anfänger-Themen 8
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
I Java Mail Timeout erst nach rund 5 Minuten? Java Basics - Anfänger-Themen 9
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
Jambolo Karten sortieren nach Rang und Farbe Java Basics - Anfänger-Themen 5
Lion.King Subtraktion nach Eingabe im Terminal Java Basics - Anfänger-Themen 7
D Programmieren nach UML Java Basics - Anfänger-Themen 2
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
K log4j nach log4j2 überführen Java Basics - Anfänger-Themen 0
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
L Zahlungen nach Monat filtern Java Basics - Anfänger-Themen 2
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
I String nach Wort suchen Java Basics - Anfänger-Themen 6
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
javaluke Erste Schritte Array nach Datentyp sortieren Java Basics - Anfänger-Themen 16
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
O 2D-Array nach einer Spalte sortieren Java Basics - Anfänger-Themen 22
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
C Meldung einer Klasse nach "oben" Java Basics - Anfänger-Themen 6
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
M Anzahl Schleifendurchgänge nach x Sekunden anzeigen Java Basics - Anfänger-Themen 2
C Lotto 3, 4, 5, 6 Richtige nach x Ziehungen ermittelt.. Java Basics - Anfänger-Themen 7
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
R JDK installieren Durcheinander nach installation von SE 14.02 Java Basics - Anfänger-Themen 6
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
B DateTimeFormatter nach LocalDateTime, wenn dd.MM.yyyy oder dd.MM.yyyy mm:hh Java Basics - Anfänger-Themen 5
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
G unklares Verhalten nach Instanzierung neuer Klasse Java Basics - Anfänger-Themen 3
S Wohin kommt das „abstract“? Vor oder nach „public“/ „private“ /... Java Basics - Anfänger-Themen 3
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
N Operatoren Schreibtischtest der Reihen-Suche nach Aufschluss in die Basics Java Basics - Anfänger-Themen 1
B Umstieg von C# nach Java Java Basics - Anfänger-Themen 18
Ellachen55 Wie nach häufigste Werte im Array suchen? Java Basics - Anfänger-Themen 2
M Untersuchen ob ein Graph nach entfernen einer Kante immer noch zusammenhängend ist Java Basics - Anfänger-Themen 70
N Wörter und Zahlen nach speziellen Wörtern ausgeben Java Basics - Anfänger-Themen 11
M Werte ändern sich nicht mehr nach Reset Java Basics - Anfänger-Themen 14
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
B String nach erstem Leerzeichen trennen Java Basics - Anfänger-Themen 7
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
O zwei Arrays nach Werten durchsuchen und zusammenfügen Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
C Erste Schritte Bilder nach Export anzeigen Java Basics - Anfänger-Themen 0
F Input/Output Files von A nach B kopieren Java Basics - Anfänger-Themen 11
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
O ADT Graph nach größe Abfragen Java Basics - Anfänger-Themen 42
O compareTo nach mehreren Kriterien Java Basics - Anfänger-Themen 13
R Benutzereingaben als Array abspeichern nach Programmstart Java Basics - Anfänger-Themen 5
S Pane nach speziellen Child Objekten durchsuchen Java Basics - Anfänger-Themen 3
V Neue Ausgabe von toString nach Methodenaufruf Java Basics - Anfänger-Themen 9
L Arrayliste von hinten nach vorne ausgeben Java Basics - Anfänger-Themen 10
F Array nach Objektattribut durchsuchen Java Basics - Anfänger-Themen 6
M Rationale Zahl erkennen - Kurze Frage zum Restwert nach Division Java Basics - Anfänger-Themen 3
O String von vorne nach hinten an einem Zeichen Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben