Threads Thread stirbt aber Objekte in ihm leben weiter?!

headgrowe

Aktives Mitglied
hallo liebe javafreunde,

wie immer sind mir threads nocht nicht so ganz klar ;(

also ich habe einen laufenden thread, welcher gewisse sachen ausführt und objekte erstellt (zb. systemTrays und ein JWindow...)

wenn dieser thread nun einen fehler wirft (exception) dann stirbt er (isAlive == false).
Was nun komisch ist, dass wenn der thread tot ist, dann ist das systemTray und das JWindow immer noch sichtbar und mir ist nicht gelungen dies zu verhindern... mit system.exit(..) ist alles tot, das möchte ich auch nicht, sondern, das der tote thread einfach verschwindet^^ thread.destroy() ist veraltet und funktioniert sowieso nicht... thread.dumpStack geht auch nicht... hab auch das einzige objekt (jBox) (was systemTray und JWindow beinhaltet) auf null gesetzt...und nichts...

also bitte ich auch um hilfe, danke :D


der zu sterbende thread:
Java:
class JboxThread extends Thread {

		private List<ActionListener> liseners;
		private JBoxController jBox;

		public JboxThread(JBoxController jBox) {
			this.jBox = jBox;
		}

		public void addActionListener(ActionListener l) {
			if (liseners == null)
				liseners = new LinkedList<ActionListener>();
			liseners.add(l);
		}

		@Override
		public void run() {

			try {
				jBox.init();
				System.out.println("updating...");
				while (jBox.syncClient()) {
					System.out.println("update successful");
					Thread.sleep(5000);
					System.out.println("updating...");
				}
				System.out.println("update wasn't successful");
				// starting thread again, afer loading config
				ConfigController
						.addActionListener(new StartingThreadListener());

			} catch (Exception e) {
				e.printStackTrace();
				// startig thread again
				fireDeadThreadEvent();
			}
			jBox = null;
			liseners = null;
			System.out.println("Exiting thread");
		}

		private void fireDeadThreadEvent() {
			if (liseners != null)
				for (ActionListener l : liseners)
					l.actionPerformed(new ActionEvent(this, 0, "Thread died"));
		}

	}


dies ist ein listener aus dem hauptthread, der gestartet wird, wenn eine configDatei geladen ist...
Java:
	private class StartingThreadListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			ConfigController.removeActionListener(this);
			final JboxThread thread = new JboxThread(jBox);
			thread.addActionListener(new StartingThreadListener());
			thread.start();

			new Thread() {
				@Override
				public void run() {
					while (true)
						if (thread.isAlive()) {
							System.out.println("alive");
							try {
								Thread.sleep(5000);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						} else {
							System.out.println("thread died");
							break;
						}
				}
			}.start();
		}
	}

grüße

head
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hab's nicht ganz nachvollzogen, aber suchst du vielleicht sowas wie
Thread thread = new Thread() { .... }
thread.setDaemon(true);
thread.start();
???
 

bERt0r

Top Contributor
jBox = null;
liseners = null;
Ich glaube du erwartest, dass wenn du eine Variable auf null setzt, das Objekt, auf das die Variable zeigt gelöscht wird. Dem ist aber nicht so. Wenn du deine jBox irgendwie beenden willst, braucht dieses Objekt eine Methode wie dispose oder so, die kannst du dann aufrufen.
 

hdi

Top Contributor
Ein Thread beinhaltet keine Objekte. Er führt nur Anweisungen aus. Stell dir vor ich mal dir ein Bild und gebe es dir. Wenn ich draufgeh hast du es noch immer ;)

Ich glaube du erwartest, dass wenn du eine Variable auf null setzt, das Objekt, auf das die Variable zeigt gelöscht wird. Dem ist aber nicht so.
Doch, klar ist dem so. Es sei denn, das war nicht die letzte Referenz.

@TO Ich verstehe leider nicht ganz was du machen willst... Aber im Falle von GUI-Komponenten bringt dir das mit = null in der Tat nix. Denn deine Box oder was auch immer wird noch immer referenziert - und zwar intern. Und das ist solange der Fall, solange du sie nicht aus der GUI rausnimmst. Methode:
Code:
remove
 
Zuletzt bearbeitet:

headgrowe

Aktives Mitglied
Danke für die vielen antworten.

also, als java programmierer muss ich mich schon auf den garbage collector verlassen können, is klar, dass er etwas zeit braucht...;)

also, wenn ich das richtig verstanden habe, muss ich zuerst das ((JWindow) w).dispose(); ausführen, um das fenster zu schließen und das trayIcon entfernen, damit sich mein thread (der eigentlich eh schon tot ist) und die objekte mit denen er gearbeitet hat, auch entfernen..

wenn ich das nun richtig verstanden habe, "überleben" aber auch nur die objekte die vom system auch referenziert werden (GUI) und die restlichen, werden entfernt, da sie keinen pointer mehr auf sich haben.

hmmm, macht soweit sinn :D

danke

grüße
jacob
 

faetzminator

Gesperrter Benutzer
Wenn du nur [c]((JWindow) w).dispose();[/c] aufrufst, dann hast du immer noch eine Referenz darauf und dieses hat wiederum Referenzen auf weitere Objekte usw.
 

hdi

Top Contributor
Nicht sofort. Erst wenn der Garbage Collector das nächste läuft und sich den entsprechenden Bereich anschaut.
Ja aber das spielt keine Rolle für's Programm bzw. den Programmierer. Wenn ein Objekt nicht mehr referenziert wird, kommt es im Programm auch nicht mehr vor, egal ob es nun noch im Speicher rumhängt oder nicht. Der TO verwechselt hier glaube ich Speichermodell mit GUI.. Zumindest verstehe ich das so. Ich muss aber sagen ich begreife eh nicht ganz was er löschen will, und was das mit irgendeinem Thread zu tun haben soll
 

bERt0r

Top Contributor
Ich wiederhole mich nochmal:
Ich glaube du erwartest, dass wenn du eine Variable auf null setzt, das Objekt, auf das die Variable zeigt gelöscht wird. Dem ist aber nicht so.
Eine Objektvariable in Java ist nur eine Referenz auf das Objekt. Wenn du diese Variable auf null setzt, liegt das Objekt immer noch im Speicher. Wann und ob der Garbage Collector den Speicher freigibt kannst du nicht wirklich festlegen.
 

hdi

Top Contributor
Und ich wiederhole nochmal:

Wenn ein Objekt nicht mehr referenziert wird, kommt es im Programm auch nicht mehr vor, egal ob es nun noch im Speicher rumhängt oder nicht.

Und damit meine ich nicht nur explizite Referenzen von Variablen des Programmierers, sondern auch intern entstehende Referenzen aus der API. Ein Objekt ist ab dem Zeitpunkt, ab dem es nicht mehr referenziert wird Garbage. Müll bleibt Müll, ob die Abfuhr nun schon da war oder noch kommt, das ist nur für den GC und das Betriebssystem von Relevanz, aber für das Programm existiert dieses Objekt nicht mehr.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
Flynn Thread-Problem... Allgemeine Java-Themen 2
G Thread-Programmierung Allgemeine Java-Themen 5
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
S Thread beenden Allgemeine Java-Themen 9
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
Aruetiise Swing JOptionPane ohne denn Thread zu pausieren Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Merkwürdiges Thread-Verhalten Allgemeine Java-Themen 6
K Thread Problem Allgemeine Java-Themen 6
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
H Thread bleibt stehen bei jar in jar Allgemeine Java-Themen 1
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
llabusch Thread blockiert Dialog Allgemeine Java-Themen 1
J Thread wait() Allgemeine Java-Themen 2
V Thread.sleep und InterruptedException? Allgemeine Java-Themen 1
G Thread nicht von GC zerstört Allgemeine Java-Themen 6
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Sogomn Thread blocken bis Taste gedrückt Allgemeine Java-Themen 5
T Starten vom Thread Allgemeine Java-Themen 3
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
Q Thread wacht nicht auf Allgemeine Java-Themen 7
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
U Thread beenden Allgemeine Java-Themen 3
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
N Thread interrupt Status debuggen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
B Threads Java Thread kommunizieren Allgemeine Java-Themen 12
N Thread Sicherheit im komplexen Datenmodell Allgemeine Java-Themen 7
K Thread richtig benutzen Allgemeine Java-Themen 3
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
vandread Problem bei kleiner Thread-Übung Allgemeine Java-Themen 2
G Thread erzeugt nicht plausible NullPointerException Allgemeine Java-Themen 7
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
P [Thread] Scheint nicht Sequenziell zu Arbeiten Allgemeine Java-Themen 9
A eine test thread.join() frage Allgemeine Java-Themen 2
tuttle64 Verständnisprobleme mit Thread Locks Allgemeine Java-Themen 4
G Threads Thread bei Datenabfrage Allgemeine Java-Themen 3
S Thread anhalten per Button ? Allgemeine Java-Themen 3
E Thread Programmierung Allgemeine Java-Themen 2
S Threads ServerSocket-Thread soll schlafen, bis er gebraucht wird Allgemeine Java-Themen 2
V Thread schneller stoppen Allgemeine Java-Themen 2
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
B Mausbewegung im Thread erkennen (hoch/runter) Allgemeine Java-Themen 6
G Linux/C++/Pthreads auf JVM zugreifen, thread safe? Allgemeine Java-Themen 10
K Threads Probleme mit Thread Allgemeine Java-Themen 13
K Threads Thread überprüfen Allgemeine Java-Themen 3
Z Threads Thread für einen Client Allgemeine Java-Themen 9
M Thread JavaFish Allgemeine Java-Themen 10
G Thread.sleep Allgemeine Java-Themen 12
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
K Timer Thread Allgemeine Java-Themen 8
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
C Mehothode in anderenm Thread aufrufen Allgemeine Java-Themen 10
R Thread läuft nicht?! Allgemeine Java-Themen 7
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
J Anderem Thread Variable mitgeben Allgemeine Java-Themen 2
C Argument an einen Thread übergeben Allgemeine Java-Themen 4
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
L Im Thread auf Eingaben warten Allgemeine Java-Themen 3
P aus Thread auf Form zugreifen Allgemeine Java-Themen 9
C Threads Thread blockieren Allgemeine Java-Themen 4
K Threads Thread für Sleep Allgemeine Java-Themen 6
K Threads Thread aktualisiert Progressbar nicht Allgemeine Java-Themen 4
D Methoden Thread Schleife Status Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben