Threads Threaded Bilder bearbeiten

codenascher

Mitglied
Hallo,

ich möchte gerne Bildmanipulationen gleichzeitig berechnen lassen, dazu habe ich mir eine Klasse einmal threaded und einmal nicht threaded geschrieben...

Leider ist die Single Threaded Klasse immer schneller als die Threaded :question:
Und das nicht mal wenig:
Single Thread: ca 1000ms
4 Threads: ca 5500ms

:bahnhof:

Anbei mal Ausschnitte:

Single Thread:
Java:
		// walk over all pixels
		for (int y = 0; y < target.getHeight(); y++) {
			for (int x = 0; x < target.getTileWidth(); x++) {
				// use only blue(should be grayscaled already)
				if ( (source.getRGB(x, y) & 0xFF ) > threshold) {
					target.setRGB(x, y, 0xFFFFFF);
				} else {
					target.setRGB(x, y, 0x000000);
				}
			}
		}

Multi Thread:

Java:
               // calculate height per core
		int blockHeight = source.getHeight() / SettingsManager.CPU_CORES;
		boolean odd = source.getHeight() % 2 != 0;

		// create threads
		Thread threads[] = new Thread[SettingsManager.CPU_CORES];
		for (int i = 0; i < SettingsManager.CPU_CORES; i++) {
			int start = i * blockHeight;
			int end = i * blockHeight + blockHeight;
			// if uneven and last block
			if (odd && SettingsManager.CPU_CORES - 1 == 1) {
				// add last line
				end++;
			}
			OperatorRunner runner = new OperatorRunner(start, end, source, target);
			threads[i] = new Thread(runner);
			threads[i].setName("thread" + i);
		}
		
		// start threads
		for (int i = 0; i < threads.length; i++) {
			threads[i].start();
		}

		
		Log.debug("Threads: " + threads.length);

		// reassemble the whole image
		for (int i = 0; i < threads.length; i++) {
			try {
				threads[i].join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		return target;
	}

	@Override
	public void updateValue(String id, Object value) {
		threshold = (Integer)value; // auto unboxing
	}

	private class OperatorRunner implements Runnable {
		private BufferedImage source, target;
		// line indices for this thread
		private int lineStart, lineEnd;

		public OperatorRunner(int lineStart, int lineEnd, BufferedImage source, BufferedImage target) {
			this.lineStart = lineStart;
			this.lineEnd = lineEnd;
			this.source = source;
			this.target = target;
		}
		

		@Override
		public void run() {
			
			Log.debug("OperatorRunner start: "+lineStart+" end: "+lineEnd);
			long start = System.currentTimeMillis();
			for (int y = 0; y < target.getHeight(); y++) {
				for (int x = 0; x < target.getTileWidth(); x++) {
					// use only blue(should be grayscaled already)
					if ( (source.getRGB(x, y) & 0xFF ) > threshold) {
						target.setRGB(x, y, 0xFFFFFF);
					} else {
						target.setRGB(x, y, 0x000000);
					}
				}
			}
			Log.debug("Zeit Thread: " + (System.currentTimeMillis() - start));
			Log.debug("OperatorRunner end: "+lineStart+" end: "+lineEnd);
		} // run
	}

Jemand eine Idee woran das liegen könnte?

Danke schon mal im vorraus :)
 

qwert

Aktives Mitglied
indem du threads.join() aufrufst, wartest du ja bis der Thread fertig ist. Also laufen deine Threads nicht alle gleichzeitig!


Und nochwas ;):
In den Zeilen 8 und 9 sorgst du dafür, dass eine Spalte (also der Randpunkt sozusagen) immer zweimal abgearbeitet wird.
 
Zuletzt bearbeitet:

codenascher

Mitglied
Ich warte bis alle Threads fertig sind um dann das Bild komplett zurückzugeben, korrekt.
Ohne ein Join würde er ja den aktuellen Stand zurückgeben der ja noch lange nicht fertig sein muss.
Wie sollte man das sonst lösen?

In Zeile 8 & 9 des Threaded Beispiels werden die Anfangs- und End Zeilen für die jeweiligen Threads berechnet, wo wird da etwas doppelt abgearbeitet?
 

qwert

Aktives Mitglied
Eine Möglichkeit wäre:
Ein globaler Zähler (mit Anzahl an Threads initialisiert) der von jedem Thread nach Ende heruntergezählt wird. Der Main-Thread wartet aktiv, bis der Zähler bei 0 steht.

Aber trotzdem:
Ich sehe nicht, wo die berechnete Breite mit in die run()-Methode einbezogen wird. Es wird doch immer das gesamte Target bearbeitet.
 
Zuletzt bearbeitet:

codenascher

Mitglied
Hast Recht, in der Zeile 62 habe ich vergessen lineStart und lineEnd zu übergeben..

Java:
 62           for (y = lineStart; y < lineEnd; y++) {

Hatte den Code per C&P des Single Threads genommen und den Threaded eines anderen Filters, das erklärt schon mal die lange Laufzeit der einzelnen Threads :D
Ändert aber nix an der Tatsache das die Threaded Lösung immer noch langsamer ist als die ohne :(

Merkwürdigerweise ist während der Ausführung von beiden Versionen die Auslastung meines QuadCores immer über 50%...
Wie ist das möglich?
 
Zuletzt bearbeitet:

qwert

Aktives Mitglied
Das Problem liegt nicht direkt an deinem Code sondern daran, dass die Methodendeklaration so aussieht:
Code:
public synchronized void setRGB(int x, int y, int rgb)
Und damit können die Zugriffe nicht parallel stattfinden.
 

codenascher

Mitglied
Das stimmt wohl die meiste Zeit wird auch dort verbracht.
Jetzt lasse ich die Teilbilder erst in seperate Bilder schreiben und setze sie danach zusammen, trotzdem ist die Lösung immer noch langsamer als Single Threaded...

Kann man das nicht weiter verbessern?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K threaded server Java Basics - Anfänger-Themen 18
S Multi Threaded Version langsamer als normale Version Java Basics - Anfänger-Themen 41
S Multi-Threaded Binäre Suche Java Basics - Anfänger-Themen 29
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
W Java in Exe Datei umgewandelt, Ressourcen fehlen (Bilder und Audiodateien) Java Basics - Anfänger-Themen 1
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
C Erste Schritte Bilder nach Export anzeigen Java Basics - Anfänger-Themen 0
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
S Bilder in .jar Datei laden Java Basics - Anfänger-Themen 10
S Bilder zoomen Java Basics - Anfänger-Themen 0
S Kann keine Bilder laden? Java Basics - Anfänger-Themen 9
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
CptK Interface Bilder mit Graphics g zeichnen Java Basics - Anfänger-Themen 7
I Projekt als .jar Datei speichern - Bilder werden nicht mehr angezeigt Java Basics - Anfänger-Themen 4
x-tshainge Java Bilder einfügen Java Basics - Anfänger-Themen 1
B Auslesen von PDF / Bilder Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Bilder werden nicht angezeigt! Java Basics - Anfänger-Themen 6
L Verschiedene Bilder per Knopfdruck anzeigen lassen Java Basics - Anfänger-Themen 17
M Bilder in .Jar exportieren Java Basics - Anfänger-Themen 2
T Bilder in ausführbarer Jar Java Basics - Anfänger-Themen 11
F 2 wechselnde Bilder Java Basics - Anfänger-Themen 4
D Verzögerung des Erscheinens der Bilder Java Basics - Anfänger-Themen 5
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
F Bilder aus jar einlesen Java Basics - Anfänger-Themen 10
J Bilder in Labels aktualisieren Java Basics - Anfänger-Themen 2
T jpeg Bilder zoomen.. Java Basics - Anfänger-Themen 2
C Bilder von Festplatte in Programm hochladen Java Basics - Anfänger-Themen 6
S Wo speicher ich bilder und sounds ab? Java Basics - Anfänger-Themen 4
K Bilder mit Eclipse exportieren Java Basics - Anfänger-Themen 1
J Slideshow zeigt bilder nicht an Java Basics - Anfänger-Themen 3
R Bilder aus Array als anklickbare Objekte Java Basics - Anfänger-Themen 3
K Export nach Jar mit Bilder Java Basics - Anfänger-Themen 2
L Wie bette ich Bilder in eine .jar ein? Java Basics - Anfänger-Themen 4
C Pfad für Bilder angeben Java Basics - Anfänger-Themen 11
B Bilder laden und drauf zugreifen[Eclipse] Java Basics - Anfänger-Themen 9
E ImageJ mehrere Bilder hintereinander bearteiten Java Basics - Anfänger-Themen 2
E HILFE Projekt für die Schule--> Bilder einfügen Java Basics - Anfänger-Themen 9
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
H Bilder ohne Verlust speichern Java Basics - Anfänger-Themen 2
J Ladebalken anzeigen während Bilder geladen werden Java Basics - Anfänger-Themen 2
R Bilder positionieren Java Basics - Anfänger-Themen 5
D Erstellte Jar datei zeigt keine Bilder an Java Basics - Anfänger-Themen 5
4 4kb bilder Java Basics - Anfänger-Themen 5
Q Pfadangabe für zu speichernde Bilder Java Basics - Anfänger-Themen 2
B Bilder speichern (jpg, gif, jpg) Java Basics - Anfänger-Themen 4
S Bilder einladen Java Basics - Anfänger-Themen 26
B Aus einem Eclipse Projekt eine .jar - keine Bilder drin Java Basics - Anfänger-Themen 7
H Bilder im GUI einfügen Java Basics - Anfänger-Themen 12
G Bilder in Jar anzeigen lassen Java Basics - Anfänger-Themen 23
T Bilder in der jar-datei Java Basics - Anfänger-Themen 10
H Zahlen Bilder zuordnen möglich? Java Basics - Anfänger-Themen 4
K BufferedImage, Bilder laden Java Basics - Anfänger-Themen 15
J Bilder von Objekten Java Basics - Anfänger-Themen 3
A Bilder in Eclipse speichern Java Basics - Anfänger-Themen 7
J Mit JS, Text und Bilder von Webseite verändern... Java Basics - Anfänger-Themen 10
S Input/Output Text und Bilder laden Java Basics - Anfänger-Themen 5
T Bilder werden in Jar nicht geladen Java Basics - Anfänger-Themen 10
S Java Web Start lädt keine Bilder Java Basics - Anfänger-Themen 2
T Buttons (auf denen bilder sind) random vertauschen Java Basics - Anfänger-Themen 11
D Bilder Laden, mit Eclipse ok, .jar nicht Java Basics - Anfänger-Themen 5
F Bilder aus .jar datei laden Java Basics - Anfänger-Themen 1
M Applet soll Bilder aus Ordner lesen Java Basics - Anfänger-Themen 9
T Transparente Bilder mit Graphics zeichnen Java Basics - Anfänger-Themen 17
F Bilder enfügen und Bewegen Java Basics - Anfänger-Themen 6
I Drehbare bilder in 3D Java Basics - Anfänger-Themen 4
M Bilder laden und zeichnen Java Basics - Anfänger-Themen 3
T JTextPane - setText kein kein neuladen der Bilder? Java Basics - Anfänger-Themen 8
A Bilder in Eclipse Java Basics - Anfänger-Themen 8
xehpuk Ordner "Eigene Bilder" ansteuern Java Basics - Anfänger-Themen 3
N Bilder Objekten zuweisen Java Basics - Anfänger-Themen 2
J Bilder auf Bilder zeichnen Java Basics - Anfänger-Themen 8
N jar kann Bilder nicht finden(?) Java Basics - Anfänger-Themen 4
S Spiel automat -Bilder vergleichen Java Basics - Anfänger-Themen 3
R Gif Bilder flimmern Java Basics - Anfänger-Themen 10
P Signiertes JAR aber keine Bilder o0 Java Basics - Anfänger-Themen 6
S Bilder der Diashow werden in anderen Bildern angezeigt Java Basics - Anfänger-Themen 3
G Bilder aus dem Projekt Verzeichnis werden n. angezeigt Java Basics - Anfänger-Themen 7
C Bilder von Server zu Server kopieren über Webdav(Sardine) Java Basics - Anfänger-Themen 5
K Bilder "langsam" laden Java Basics - Anfänger-Themen 4
FreddyStepp Bilder zusammenfügen Java Basics - Anfänger-Themen 7
B GUI-Bilder einfügen Java Basics - Anfänger-Themen 40
S Bilder vergleichen Java Basics - Anfänger-Themen 6
B Kann man im Thread Bilder laden? Java Basics - Anfänger-Themen 8
S Wo speichere ich Bilder für Applets (Netbeans) Java Basics - Anfänger-Themen 5
J Mehrere Bilder laden Java Basics - Anfänger-Themen 6
D Bilder einfügen Java Basics - Anfänger-Themen 8
W Bilder einfügen? Java Basics - Anfänger-Themen 2
S Mehrere Bilder bewegen Java Basics - Anfänger-Themen 5
B Bilder zeichnen Java Basics - Anfänger-Themen 2
D Bilder in JFrame laden Java Basics - Anfänger-Themen 8
L Frage bzgl. Threads beim Bilder laden Java Basics - Anfänger-Themen 3
S Bilder in AWT Java Basics - Anfänger-Themen 7
J java applets bilder? Java Basics - Anfänger-Themen 11
manunana89 Bilder auf JFrame/beste Möglichkeit??? Java Basics - Anfänger-Themen 5
K Bilder werden nicht angeziegt !!! Java Basics - Anfänger-Themen 2
max56 Bilder ausgeben Java Basics - Anfänger-Themen 21
K Bilder/Dateien aus package einlesen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben