mehrere Threads verwalten?

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,
ich habe eine relativ komplexe Anwendung welche die Abarbeitung von mehreren Datein vornimmt.
Es werden z.B. 100 files geladen und irgendwas damit gemacht und wieder gespeichert.

Zur zeit ist es so das ein file nach dem anderen abgearbeitete wird.

Ich wollte jetzt die Abarbeitung gleichzeitig mit Thread laufen lassen.

Ist natürlich nicht so gut z.B. 100 Threads aufzumachen oder auch mehr.
Da gibts ja immer ne OutOfMemoryException.

Weis jemand wie ich das am geschicktesten Regeln kann?

Dachte mir z.B. immer 5 Threads laufen zu lassen, oder gibts vielleicht ne
Möglichkeit das automatisiert laufen zu lassen.

Also so viele Threads wie mögliche ohne das es eine Exception gibt?



Danke schonmal für euere Antworten.
 

Niki

Top Contributor
Du brauchst einen ThreadPool der Threads startet. Diese Threads warten bis etwas in eine Queue gelegt wird und holen das automatisch ab. Müsste so aussehen:

WorkerThread:

Code:
import java.util.NoSuchElementException;

public class WorkerThread implements Runnable {
	
	private ThreadPool pool = null;
	
	public WorkerThread(ThreadPool pool){
		this.pool = pool;
	}

	public void run() {
		while(true){
			try{
				Runnable r = pool.getNextRunnable();
				r.run();
			}catch(NoSuchElementException ex){
				synchronized(pool){
					try {
						pool.wait();
					} catch (InterruptedException e) {						
					}
				}
			}
		}
	}

}

ThreadPool:
Code:
import java.util.LinkedList;
import java.util.NoSuchElementException;

public class ThreadPool {

	private LinkedList<Runnable> runnables = null;

	public ThreadPool(int count) {
		runnables = new LinkedList<Runnable>();
		for (int i = 0; i < count; i++) {
			new Thread(new WorkerThread(this)).start();
		}
	}

	public synchronized Runnable getNextRunnable()
			throws NoSuchElementException {
		return runnables.removeFirst();
	}

	public synchronized void addRunnable(Runnable r) {		
		runnables.add(r);
		notifyAll();
	}
}

TestKlasse:
Code:
public class StartThreadPool {
	public static void main(String[] args) {
		ThreadPool pool = new ThreadPool(10);
		for(int i = 0; i < 100; i++){
			final int num = i;
			pool.addRunnable(new Runnable(){
				public void run() {
					System.out.println(num + " working");
					try {
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						
					}
					System.out.println(num + " finished");
				}
			});
		}
		System.out.println("100 Jobs added");
	}
}
 

quippy

Bekanntes Mitglied
Mmmh, mit ist da was aufgefallen, was zu einem Problem werden könnte:

Wenn man in einer Runnable::run()-Methode eine (Endlos-)schleife baut und dort viel unternimmt, ohne mal einen Thread.sleep(..) einzubauen, wird keine Zeit an die anderen Threads mehr abgegeben (kooperatives Multitasking in Java?)

Daher könnte deine ThreadPool-Worker-Methode die gesamte VM etwas lahmlegen. Eine Alternative hätte ich für die spezielle Methode allerdings auch nicht so direkt parat, da Du ja an die Worker-Methode des eigentlichen Threads weiterleitest - man müßte dort also aufpassen.
 

Niki

Top Contributor
Richtig, der eigentliche Worker muss dafür sorgen, dass er nicht die gesamte CPU frisst.
 
G

Guest

Gast
Danke erstemal für die detailierte Antwort.

Habe das jetzt so implementiert wie du beschreiben hattest.
Bekomme aber jetzt folgende Exception:
Code:
Exception in thread "Thread-9" java.lang.OutOfMemoryError: Java heap space

??
 
G

Gast

Gast
sorry jetzt erst dioe letzten Posts gesehen probiere das mal mit nen paar Sleeps.
 

tfa

Top Contributor
quippy hat gesagt.:
Wenn man in einer Runnable::run()-Methode eine (Endlos-)schleife baut und dort viel unternimmt, ohne mal einen Thread.sleep(..) einzubauen, wird keine Zeit an die anderen Threads mehr abgegeben (kooperatives Multitasking in Java?)

Wie meinst du das? Die anderen Threads werden gar nicht mehr ausgeführt? Das stimmt so nicht ganz. Normalerweise werden unter Java normale (betriebssystem-seitige) Threads (d.h. präemtives Multitasking) benutzt. In der Frühzeit von Java (und unter bestimmten Plattformen sicherlich auch noch heute), verwendete man Green Threads, die nur kooperativ funktionieren. Heute sollte das kein Problem mehr sein.
 
G

Guest

Gast
Habs jetzt so wie hier beschrieben implementiert und auch ein paar Sleeps eingebaut.

Bekomme aber immer noch folgende Exception:
Code:
Exception in thread "Thread-9" java.lang.OutOfMemoryError: Java heap space

:?:
 

quippy

Bekanntes Mitglied
tfa hat gesagt.:
quippy hat gesagt.:
Wenn man in einer Runnable::run()-Methode eine (Endlos-)schleife baut und dort viel unternimmt, ohne mal einen Thread.sleep(..) einzubauen, wird keine Zeit an die anderen Threads mehr abgegeben (kooperatives Multitasking in Java?)

Wie meinst du das? Die anderen Threads werden gar nicht mehr ausgeführt? Das stimmt so nicht ganz. Normalerweise werden unter Java normale (betriebssystem-seitige) Threads (d.h. präemtives Multitasking) benutzt. In der Frühzeit von Java (und unter bestimmten Plattformen sicherlich auch noch heute), verwendete man Green Threads, die nur kooperativ funktionieren. Heute sollte das kein Problem mehr sein.

Meine Erfahrung (und es mag sein, daß ich da was falsch implementiert habe!) hat gezeigt, daß die VM sehr langsam reagiert, wenn man in einem Thread keinen sleep drin hat. Ich finde das auch nicht glücklich und hätte auch nicht erwartet, daß das so ist - habe ich aber genau so erlebt.

Das "keine Zeit abgegeben" stimmt in der Tat nicht und hatte ich auch so nicht gemeint - "wenig Zeit" wäre korrekt. Selbstverständlich werden auch die anderen Threads noch ausgeführt, aber z.B. ein Remote-Debugger reagiert plötzlich sehr zäh.

Die Threads, die ich damit meine, sind als InnerClass geschrieben worden und leiten von Thread ab. Könnte das falsch sein?
 

quippy

Bekanntes Mitglied
Anonymous hat gesagt.:
Habs jetzt so wie hier beschrieben implementiert und auch ein paar Sleeps eingebaut.

Bekomme aber immer noch folgende Exception:
Code:
Exception in thread "Thread-9" java.lang.OutOfMemoryError: Java heap space

:?:

Könnte es sein, daß Du viele Objekte erzeugst? Arbeitest Du vielleicht mit viel Rekursion?

Ich frage mich gerade, ob die Terminologie in Java auch "heap" und "far heap" ist oder ob mit dem heap space der der VM zur Verfügung stehende Hauptspeicher gemeint ist?

Du kannst übrigens mit VM-Parametern "-Xms1024m -Xmx1024m" den der VM zugeteilten Speicher erhöhen. (äh - google mal, welcher was macht... Hier wird minimum und maximum 1 Gig zugewiesen - nicht unbedingt optimal)
 

tfa

Top Contributor
quippy hat gesagt.:
Meine Erfahrung (und es mag sein, daß ich da was falsch implementiert habe!) hat gezeigt, daß die VM sehr langsam reagiert, wenn man in einem Thread keinen sleep drin hat. Ich finde das auch nicht glücklich und hätte auch nicht erwartet, daß das so ist - habe ich aber genau so erlebt.

Das "keine Zeit abgegeben" stimmt in der Tat nicht und hatte ich auch so nicht gemeint - "wenig Zeit" wäre korrekt. Selbstverständlich werden auch die anderen Threads noch ausgeführt, aber z.B. ein Remote-Debugger reagiert plötzlich sehr zäh.
Ja, das ist richtig. Wenn ein Thread viel macht und die CPU belastet, wird natürlich alles träge (ein Java-Programm ohne Nebenläufigkeit hat ja schon mind. einen Thread).
Man kann aber auch durch Setzen der Thread-Priorität noch einiges optimieren.

quippy hat gesagt.:
Die Threads, die ich damit meine, sind als InnerClass geschrieben worden und leiten von Thread ab. Könnte das falsch sein?
Nein, wie die Threads implementiert werden ist egal.
 

quippy

Bekanntes Mitglied
tfa hat gesagt.:
Wenn ein Thread viel macht und die CPU belastet, wird natürlich alles träge (ein Java-Programm ohne Nebenläufigkeit hat ja schon mind. einen Thread).

Das ist ja das doofe - die CPU war nicht ausgelastet. Ein eingestreuter "Thread.sleep(1L);" (inklusive IntrruptException-Behandlung) hat dann diese "Belastung" relativiert.
 
G

Gast

Gast
So läuft jetzt soweit.
Danke.
Aber eine Frage habe ich noch.

Wie kann ich denn meinen Java-Programm zum Beipiel eine maximale CPU Last zuteilen? Geht das überhaupt?
 

quippy

Bekanntes Mitglied
Gast hat gesagt.:
So läuft jetzt soweit.
Danke.
Aber eine Frage habe ich noch.

Wie kann ich denn meinen Java-Programm zum Beipiel eine maximale CPU Last zuteilen? Geht das überhaupt?

Das ginge IMHO nur über das Betriebsystem.

Unter Linux/Unix könntest Du den "nice"-Level (select the level how nice you are ;)) einstellen, so daß der OS-Thread deines Programms weniger Aufmerksamkeit bekommt.

Unter Windows geht das über den Task-Manager (Lasche Prozesse -> Rechtsklick auf den javaw-Prozess, dann Priorität festlegen)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
F Mehrere Threads - ein Stack Allgemeine Java-Themen 6
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
T Mehrere Threads greifen auf eine Klasse zu Allgemeine Java-Themen 21
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
berserkerdq2 Ist es schlechter Programmierstyle mehrere Panes aufeinander zu machen? Allgemeine Java-Themen 1
Tarrew OpenAPI Schnittstelle - Mehrere Kunden mit unterschiedlichen Zugriffsrechten Allgemeine Java-Themen 2
A Mehrere for-Schleifen Allgemeine Java-Themen 2
M Mehrere Sounds Allgemeine Java-Themen 3
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
Avalon DTO aus mehrere Entitäten erstellen Allgemeine Java-Themen 5
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
bueseb84 Git : Mehrere Server verwenden Allgemeine Java-Themen 3
L Mehrere .Jar Files aufrufen Allgemeine Java-Themen 9
L mehrere Methoden Allgemeine Java-Themen 19
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
T String mehrere Worte Allgemeine Java-Themen 2
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
S libGDX mehrere Texturen zu Einer zusammenfassen Allgemeine Java-Themen 0
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
OnDemand CSV parsen mehrere Zeilen Allgemeine Java-Themen 22
K Mehrere Programmiersprachen gleichzeitig lernen Allgemeine Java-Themen 3
C Mehrere Seiten drucken in Hoch- und Querformat Allgemeine Java-Themen 0
perlenfischer1984 Mehrere Komponenten erstellen Allgemeine Java-Themen 3
F AWT Mehrere Tastatureingaben verarbeiten Allgemeine Java-Themen 5
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
HarleyDavidson Best Practice Integer-Zahlenfolge über mehrere Programmstarts Allgemeine Java-Themen 7
F Mehrere JTables' drucken Allgemeine Java-Themen 0
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
stylegangsta Mehrere html seiten einer Homepage einlesen und als Textdatei ausgeben Allgemeine Java-Themen 14
P Mehrere Java Versionen auf dem Rechner Allgemeine Java-Themen 3
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
S PrintWriter.println() schreibt mehrere Zeilen Allgemeine Java-Themen 19
2 Mehrere Uhrzeiten Sortieren Allgemeine Java-Themen 2
T Jsoup: Mehrere Links nacheinander parsen Allgemeine Java-Themen 11
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
E Lesen von mehrere Csv-Datei und ihre Inhalte vergleichen Allgemeine Java-Themen 3
K GUI-Entwicklung - Dispose, enabling und mehrere Controller Allgemeine Java-Themen 1
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
H Mehrere Bilder aus einer Datei lesen Allgemeine Java-Themen 2
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
K Mehrere Arrays auf einmal erstellen Allgemeine Java-Themen 2
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
J JFreeChart - Mehrere X-Achsen Einteilungen Allgemeine Java-Themen 3
S Mehrere Shapes "malen" Allgemeine Java-Themen 3
M Input/Output Mehrere Bilder aus Resourcen auslesen Allgemeine Java-Themen 8
J Erste Schritte Mehrere Mauszeiger für Ping Pong Game Allgemeine Java-Themen 7
P Mehrere MP3s abspielen Allgemeine Java-Themen 3
M Mehrere CRLF entfernen Allgemeine Java-Themen 13
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
B JUnit und mehrere Instanzen der selben Applikation Allgemeine Java-Themen 4
A Email versenden mehrere Zeilen Allgemeine Java-Themen 10
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
R JTree - Mehrere Roots Allgemeine Java-Themen 6
Beckenbauer Mehrere Paragraphe in eine Word Datei schreiben Allgemeine Java-Themen 4
H Mehrere Anwendungen von Java kontrollieren lassen Allgemeine Java-Themen 10
T Edit: JLabel+MouseListener oeffnet mehrere Instanzen Allgemeine Java-Themen 5
O split mit einem ODER mehrere Tabulatoren oder Leerzeichen Allgemeine Java-Themen 6
M JFreeChart mehrere PieCharts erstellen Allgemeine Java-Themen 2
S Wie kann ein Observer mehrere Observables beobachten? Allgemeine Java-Themen 9
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
B mehrere services in einem client Allgemeine Java-Themen 10
G Process - mehrere Commands?! Allgemeine Java-Themen 2
O Mehrere Exemplare(Kopieen) drucken Allgemeine Java-Themen 2
S log4j Logging über mehrere Klassen Allgemeine Java-Themen 13
F 1 Key - mehrere Values Allgemeine Java-Themen 3
G JOGL mehrere GLCanvas erstellen Allgemeine Java-Themen 2
S Mehrere Listen ineinander verschachteln Allgemeine Java-Themen 22
P Java3D mehrere Ebenen parallel zu yz-Ebene Allgemeine Java-Themen 9
R mehrere jar Dateien kompinieren Allgemeine Java-Themen 14
P Mehrere Instanzen der selben Appl. verhindern Allgemeine Java-Themen 12
M Scanner-Methode: Mehrere Eingaben mit Exception behandeln Allgemeine Java-Themen 10
I Wie kann ich mehrere Mp3 Tags ausgeben? Allgemeine Java-Themen 6
I Mehrere MP3 Dateien einlesen? Allgemeine Java-Themen 3
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
C ArrayList sortieren (mehrere Kriterien) Allgemeine Java-Themen 6
N mehrere klassen extenden Allgemeine Java-Themen 33
G Oracle will mehrere hundert Produkte patchen Allgemeine Java-Themen 5
F Logger in mehrere Dateien mit log4J Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
Daniel_L Mehrere (XML-)Datei aus einer ZIP-Datei auslesen Allgemeine Java-Themen 4
V Mehrere main() in jar, wie starten? Allgemeine Java-Themen 4
A Problem: Mehrere PDF-Files nacheinander Öffnen Allgemeine Java-Themen 12
D Mit Linux mehrere Kommandos in einem Subprozeß Allgemeine Java-Themen 3
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
V JFilechooser, mehrere Datein selektieren und Reihenfolge? Allgemeine Java-Themen 2
K Applet dass auf mehrere Bibliotheken zugreift Allgemeine Java-Themen 13
F mehrere Verzeichnisse als Parameter Allgemeine Java-Themen 15
G mehrere url's in ein array (problem mit // ) Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben