Feststellen ob kein extra Thread läuft

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Im zusammenhang mit diesem Thread http://www.java-forum.org/de/viewtopic.php?t=22432&highlight= hat sich ein neues Problem aufgetan. Ich habe eine kleine Suche programmiert, die mit Multithreading arbeitet (geht zumindest bei mir schneller, näheres in dem verlinktem Thread :wink: ) und für jeden neuen Ordner einen extra Thread öffnet um diesen zu druchlaufen. Jetzt ist würde ich gerne wissen, wie ich möglichst ohne Performanceeinbusen mein Hauptprogramm erst dann weiterlaufen lassen kann, wenn alle anderen Threads beendet sind.
 

SnooP

Top Contributor
Kannst du im Hauptprogramm an der Stelle nicht einfach nen Thread.join() machen? Dann wartet es so lange, bis alle anderen Subthreads gestorben sind.
 

The_S

Top Contributor
Warum kann ich in der public kein Thread.join() machen? Ist Thread static? Bin grad auf dem Sprung heim, deswegen ein wenig geistig abwesend :wink:
 

Bleiglanz

Gesperrter Benutzer
auf jeden Fall brings was, für Directories OHNE Subdirs keinen thread zu verbraten!

Code:
	public static void main(String[] args) {
		start = System.currentTimeMillis();
		searchMulti(new File("/tmp"), "test"); //$NON-NLS-1$ //$NON-NLS-2$
		Thread warter = new Thread(){
			public void run(){
				while(counter.get()>0){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		warter.start();
		try {
			warter.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out
				.println("searchMulti " + (System.currentTimeMillis() - start)); //$NON-NLS-1$ //$NON-NLS-2$
		System.out.println(trefferliste);
		trefferliste.clear();
		start = System.currentTimeMillis();
		searchSingle(new File("/tmp"), "test"); //$NON-NLS-1$ //$NON-NLS-2$
		System.out
				.println("searchSingle " + (System.currentTimeMillis() - start)); //$NON-NLS-1$ //$NON-NLS-2$
		System.out.println(trefferliste);

	}

	static Vector<File> trefferliste = new Vector<File>();

	static long start;

	static AtomicInteger counter = new AtomicInteger(0);

	static void searchMulti(final File dir, final String search) {
		File[] files = dir.listFiles();
		if (null != files) {
			for (File file : files) {
				if (file.getName().equalsIgnoreCase(search)) {
					trefferliste.addElement(file);
				}
				if (file.isDirectory()) {
					final File dirToScan = file;
					(new Thread(){
						public void run() {
							counter.incrementAndGet();
							try {
								searchMulti(dirToScan, search);
							} finally {
								counter.decrementAndGet();
							}
						}
					}).start();					
				}
			}
		}
	}

	static void searchSingle(final File dir, final String search) {
		File[] files = dir.listFiles();
		if (null != files) {
			for (File file : files) {
				if (file.getName().equalsIgnoreCase(search)) {
					trefferliste.addElement(file);
				}
				if (file.isDirectory()) {
					searchSingle(file, search);
				}
			}
		}
	}
}

das mit dem joinen ist wohl übel, weil ja ständig neue Threads losgetreten werden, man müsste dazu wohl buchführen
 

Solour

Aktives Mitglied
such ma nach Thread#getThreadGroup()
und dann müsstest du eben immer einen aus der group joinen bis die leer ist, oder eben selber die threads in nen vector packen wenn du sie startest und am ende alle joinen..
 

SnooP

Top Contributor
Thread.join() ist static, wie alle anderen Methoden auch von Thread...
Wenn das Starten der Einzelthreads per rekursiver Methode im Hauptprogramm abläuft, könnte doch das join dort direkt nach dem Aufruf der Methode erfolgen - damit stellt man dann doch sicher, dass dort erst weitergemacht wird, wenn alle Ergebnisse eingesammelt wurden, ansonsten kann man das ja halt nicht sicher wissen und läuft gefahr mit Daten zu operieren, die noch nicht vollständig sind...

das mit den leeren Verzeichnissen sollte aber schonmal Sinnhaftig sein ;)
 

Bleiglanz

Gesperrter Benutzer
SnooP hat gesagt.:
Wenn das Starten der Einzelthreads per rekursiver Methode im Hauptprogramm abläuft, könnte doch das join dort direkt nach dem Aufruf der Methode erfolgen - damit stellt man dann doch sicher, dass dort erst weitergemacht wird, wenn alle Ergebnisse eingesammelt wurden

ja aber das wär ja das gleiche wie singleThreaded!

joinen geht IMHO bei dem Problem nicht, weil ja am laufenden Band Threads erzeugt werden, die müsste man sich alle merken und dann am ende alle joinen (aber wozu?)

auch die neuen Sachen wie Futures und die CyclicBarrier usw. verlangen dass man vorher weiss, auf wieviele Threads man warten will

aber mal was grundsätzliches:

auf einer 1CPU Normalomaschine ist die Multithreaded Version IMMER langsamer (und verbrät auch ganz schön Speicher)

sinnvoll wär das z.B. wenn man riesige Verzeichnisse durchsuchen will und nebenbei eine Anzeige in der GUI auffüllen ("Responsiveness"), aber dazu reicht prinzipiell erstmal ein Thread

und wenn ein directory bloss 10-100 Einträge hat, dann ist so ein Thread wahrscheinlich in seiner ersten Zeitscheibe sofort fertig und der Overhead möglicherweise nicht gerechtfertigt...
 

Solour

Aktives Mitglied
Bleiglanz hat gesagt.:
SnooP hat gesagt.:
aber mal was grundsätzliches:

auf einer 1CPU Normalomaschine ist die Multithreaded Version IMMER langsamer (und verbrät auch ganz schön Speicher)
werden mehrere java-threads überhaupt unter z.B. windows auf meherer prozessoren verteilt? oder ist das dann ein prozess?
unter unix (hab ich mal gehört) wird für jeden thread ein prozess getartet (stimmt das?)

insgesamt hört sich das für mich auch eher nach etwas an, was man besser iterativ und ohne threads macht
 

SnooP

Top Contributor
Das Quoting ist etwas kaputt ;) ... - aber ich hatte jetzt einfach mal vermutet, dass Multiprozessoren dabei besser agieren können - immerhin ist es Aufgabe des OS die Threads an den Prozessor zu reichen - und anstatt nach dem normalen Round-Robin-Prinzip vorzugehen, könnte jetzt auch einfach ein weiterer Prozessor berücksichtigt werden...
Ich hab auch sowieso nicht ganz geblickt warum der OP das überhaupt so haben wollte ;)...

Das mit Prozessen und Threads unter Unix halte ich für ein Märchen ;) ... ein Thread wurde ja gerade eingeführt, weil es nicht soviel kostet einen solchen neu zu erstellen... Prozess bedeutet immer erheblich mehr Schritte die ausgeführt werden müssen... von daher wäre es sinnfrei, wenn Unix(e) generell jeden Thread in einen Prozess kapseln würde.
 

Bleiglanz

Gesperrter Benutzer
ob mehrere Pozessoren genutzt werden und ob ggf. leichtgewichtige threads verwendet werden hängt einfach von der JVM - Version - Hersteller - Betreibssystem ab, kann man nicht pauschal sagen
 

The_S

Top Contributor
Hab jetzt ne Übergangslösung, statt alles in nem Vector zu speichern, speicher ich es gleich in eine JList so das der User die ergebnisse angezeigt bekommt. Aber irgendwie anders wäre natürlich schöner ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Feststellen, Welche Classes ich aus einem JAR nutze? Allgemeine Java-Themen 6
Speed FariyDragon Startsituation des Programms Feststellen Allgemeine Java-Themen 1
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
S Suche Konzept: Korrektheit des Aufrufers feststellen Allgemeine Java-Themen 7
S Applet nicht signierte Komponenten feststellen Allgemeine Java-Themen 6
P Java Heap Size feststellen Allgemeine Java-Themen 6
S File encoding feststellen Allgemeine Java-Themen 4
S Maximalen und maximal verfuegbaren RAM feststellen? Allgemeine Java-Themen 4
T Feststellen ob System-Konsole verfügbar Allgemeine Java-Themen 2
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
R Feststellen, ob String in einem String vorkommt. Allgemeine Java-Themen 5
I JMF - feststellen wenn mp3 aus Allgemeine Java-Themen 10
T läuft mein Programm schon? - wie feststellen Allgemeine Java-Themen 6
H Systemfarben feststellen Allgemeine Java-Themen 4
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
A Wie das OS und Sprache feststellen? Allgemeine Java-Themen 15
M Objekt ID feststellen! Allgemeine Java-Themen 3
N Wie kontakt von 2 gezeichneten Rechtecken feststellen? Allgemeine Java-Themen 25
S Aufrufende Klasse feststellen, ohne "this"-Paramet Allgemeine Java-Themen 7
Zrebna SonarLint: Warum kein Null-Referencing-CodeSmell-Hint hier? Allgemeine Java-Themen 23
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
I OpenPDF (ehem. iText) will kein PDF mit CMYK only erzeugen Allgemeine Java-Themen 6
A Kein Online-Zugang mögl.! Allgemeine Java-Themen 4
D kein Versand von Mails mit Anhang mehr Allgemeine Java-Themen 2
D Best Practice Gesamten Bildschirminhalt auslesen und Email schicken sobald kein Pixel sich ändert Allgemeine Java-Themen 11
R Warum kein throw? Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
A Datentypen Long.valueOf liefert kein "L" am Ende Allgemeine Java-Themen 3
M Kein Zugriff auf microSD Karten Allgemeine Java-Themen 4
B Input/Output Server Startet, Jedoch Kein Output. Allgemeine Java-Themen 1
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
Guybrush Threepwood Kein user.home unter Windows8 Allgemeine Java-Themen 7
127.0.0.1 SQL Exception, kein Driver Allgemeine Java-Themen 9
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
D Eclipse Kein Zugriff auf Inhalt einer referenzierten .jar Allgemeine Java-Themen 5
S Schnell eine fortlaufende nummer erzeugen SQL, kein Primkey Allgemeine Java-Themen 8
P Mail wird nicht gesendet - Muss ich kein PW angeben ? Allgemeine Java-Themen 13
G RegEx kein Unterstrich Allgemeine Java-Themen 2
E kein doppelter Programmaufruf Allgemeine Java-Themen 3
reibi Workspace schon geöffnet (Kein Eclipse Thema) Allgemeine Java-Themen 14
D Kein Zugriff auf WebService ausser localhost Allgemeine Java-Themen 4
H Bestimmten String mit Pattern und Matcher herauslesen => kein erfolg Allgemeine Java-Themen 9
Haave Audio Device Unavailable: Kein gleichzeitiger Zugriff auf Soundsystem möglich Allgemeine Java-Themen 7
Z Boolean Abfrage gibt kein Boolean zurück, aber warum? Allgemeine Java-Themen 6
T GregorianCalendar - kein Februar Allgemeine Java-Themen 6
0 kein Java unter Server 2008 ? Allgemeine Java-Themen 3
I kann JAVA kein Mathe? Allgemeine Java-Themen 10
J Kein Zugriff auf Klassen im Default Package Allgemeine Java-Themen 8
F Threading oder kein Threading - das ist hier die Frage. Allgemeine Java-Themen 23
V FileWriter und Zahlen (Kein Problem, nur Verständnisfrage) Allgemeine Java-Themen 4
T Problem, warum macht der das so(finde kein titel.) Allgemeine Java-Themen 3
K Kein schließendes Tag bei leerem Element mit JDOM Allgemeine Java-Themen 8
D Ich ikann kein Java-Programm starten Allgemeine Java-Themen 10
B Ausführungsproblem: admin, kein admin Allgemeine Java-Themen 2
E Warum kein Import? Allgemeine Java-Themen 3
L Kein Ausführen möglich Allgemeine Java-Themen 3
A Kein finally ausführen trotz verlassen des try blocks? Allgemeine Java-Themen 14
egrath Anonyme Methode - warum hier kein Compilerfehler Allgemeine Java-Themen 2
D kann kein java installieren Allgemeine Java-Themen 2
S Kein Sound in Java Applets unter Win 9x Allgemeine Java-Themen 4
P kein sound bei freenet spielen Allgemeine Java-Themen 2
K Scanner.hasNext findet kein Ende Allgemeine Java-Themen 6
K Problem mit Vererbung - Kein wirklicher Nutzen. Allgemeine Java-Themen 10
Redfrettchen addAll verwendet kein Iterator? Allgemeine Java-Themen 8
P Eclipse: Kein Fehler beim Debuging aber beim normalen run Allgemeine Java-Themen 3
U Versions-Konfusion: Ist long kein object? Allgemeine Java-Themen 3
A Dateistatus abfragen und Datei löschen sobald kein Zugriff Allgemeine Java-Themen 7
M DOS-Shell kennt kein CP850!! Allgemeine Java-Themen 2
D Kein public Konstruktor Allgemeine Java-Themen 4
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
I AWT MouseListener Extra Knopf auf der Maus Allgemeine Java-Themen 9
P Threads Thread innerhalb einer Klasse - ohne Extra Klasse Allgemeine Java-Themen 9
H Extra-Thread sinnvoll für XML-Datei laden? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben