[Threads]: Mit mehreren Threads 1 ArrayList durchlaufen

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich habe derzeit teilweise recht große Listen die ich durchlaufe und einige Objekte entsprechend von verschiedenen Kriterien aus der Liste schmeisse. Ich würde das ganze gern ein wenig beschleunigen (bzw. schauen ob es schneller wird) in dem ich mit 2 oder mehreren (vllt. max. 5) Threads gleichzeitig eine Liste durchlaufe und wenn jeder Thread fertig ist diese dann an das Programm zurückgegeben wird.

Einfach ausgedrückt:

Gib Liste an Methode und warte => Durchlaufe Liste in X Threads => Wenn fertig durchlaufen, gebe Liste zurück und weiter

Hat da jmd. vllt mal ein Beispiel? I wie weiss ich nicht so recht wie das ganze aussehen muss wenn man mit mehreren Threads in einer Methode auf eine Liste zugreift :-(

Danke!
 
M

maki

Gast
Klar geht das, nur dürfen die Threads nicht die Liste ändern sonst gibt's Ärger.
 

tfa

Top Contributor
Die sinnvolle maximale Anzahl Threads bekommst du mit Runtime.availableProcessors().
 
G

Guest

Gast
maki hat gesagt.:
Klar geht das, nur dürfen die Threads nicht die Liste ändern sonst gibt's Ärger.
Öhh abe rich will ja Elemente entfernen ... ;)

@tfa: Hmm okay ...

Jetzt müsste ich nur noch wissen wie das ganze auszusehen hat mit mehreren Threads auf eine Liste drauf zu gehen :)
 
M

maki

Gast
Öhh abe rich will ja Elemente entfernen ... icon_wink.gif
Das geht nicht.

Vielleicht gibt es noch eine andere Möglichekit die Sache zu beschleunigen.

Verwendest du LinkedList oder ArrayList?
Bei vielen remove/insert Operationen ist erstere um einiges schneller als letztere, allerdings solltest du nicht versuchen mit get(i) oder anderen Indexbasierten Operation auf eine LinkedList zuzugreifen, mit einem (List-)Iterator ist es am schnellsten.
 
G

Guest

Gast
Benutze ArrayList, werde es aber mal mit einer LinkedList ausprobieren.

Wenn das mit dem löschen nicht geht eben der andere Weg:
Ich durchlaufe eine Liste und immer wenn ein Element auf mein Kriterium passt bzw. eben nicht, stopfe ich es in eine neue Liste, das sollte doch eigtl. funktionieren oder?
 
M

maki

Gast
Wie gesagt, es kommt auf die Anwednung an...

Wie iterierst du über deine Liste?
 
G

Guest

Gast
maki hat gesagt.:
Wie iterierst du über deine Liste?

for (Iterator lIterator = pList.iterator(); lIterator.hasNext();)
{
// mache Kram
}

Eigtl. so ... Aber genau DAS ist mein Problem, ich weiss nicht wie ich mit mehreren Threads über eine Liste iterieren kann ;)
 
M

maki

Gast
Wie gesagt, mehrere Threads helfen dir NICHT.

So wie du über die Liste iterierst ist es gut, wenn du deine Referenzen als List deklariert hast, zB:
Code:
List pList = new ArrayList();
Musst du nur noch ArrayList durch LinkedList austauschen und dann weisst du ob dir das hilft.

Wenn du allerdings (entgegen aller Empfehlungen) die Referenz mit der Implmentierung anstatt des Interfaces angelegt hast zB:
Code:
ArrayList pList = new ArrayList();
.. hast du natürlich mehr Aufwand, aber das sollte man sowieso nicht machen.
 
G

Gast

Gast
macht kaum einen merklichen unterschied wenn ich das ArrayList gegen LinkedList austausche.

Warum würde es nicht schneller gehen wen nich mit mehreren Threads über eine Liste iteriere OHNE etwas an der Liste zu ändern?
 
M

maki

Gast
Woher weisst du denn dass das iterieren solange dauert?
Schon mal einen Profiler angschmissen oder ist das deine Vermutung (=geraten)?

Denke an die 80/20 Regel.
 
G

Guest

Gast
maki hat gesagt.:
Woher weisst du denn dass das iterieren solange dauert?
Schon mal einen Profiler angschmissen oder ist das deine Vermutung (=geraten)?

Denke an die 80/20 Regel.

das ist relativ einfach. wen nich die methode die durch die liste iteriert auskommentiere sehe ich meine daten sofort in der gui, wenn ich durchiteriere dauert es im moment ~10 sekunden ...
 
M

maki

Gast
Das ist geraten :)

Solltest schon rausfinden was genau so lange dauert (wirst ja mehr mehr machen als nur durchiterieren), diese Frage kann nur ein Profiler beantworten.

Alles andere wäre Quatsch.
 
G

Guest

Gast
maki hat gesagt.:
(wirst ja mehr mehr machen als nur durchiterieren)

ich filtere die daten nach bestimmten werten und das ist logischerweise auch das was so lange dauert.
Aus diesem Grunde möchte ich ja diesen Teil in Threads auslagen um vllt. nochmal 3-4 Sekunden oder dergleichen gut zu machen.

Kann mir denn nun niemand sagen wie ich mit mehrerenb Threads auf eine Liste / einen Iterator zugreife?!
 
G

Gast

Gast
Hab jetzt gesehen, dass ein ListIterator auch Objekte löschen kann, soviel also dazu ...

Kann mir sonst allerdings niemand sagen wie ich mit mehreren Threads gleichzeitig auf einen Iterator gehen kann?
 
G

Guest

Gast
Wenn ich endlich wissen würde wie 2 Threads gemeinsam auf einen Iterator zugreifen würd ichs wohl sogar sehen. Sorry fürs bisschen meckern, aber iwie vermiss ich immer noch eine Antowrt auf meine eigtl. Frage ;)
 
M

maki

Gast
Was ist denn deine konkrete Frage?

Ansonsten kann man nur wage antworten:
2 Threads erstellen und beide auf einen Iterator losschicken, die ConcurrentModificationException sehen und eine andere Lösung suchen... ;)

Wie weit hast du denn den Code schon geschrieben?
 

SchonWiederFred

Bekanntes Mitglied
Mehrere Threads, die auf dieselbe Datenstruktur zugreifen? Keine gute Idee. Du sagst, Du hast mehrere Listen. Lass doch jeden Thread seine eigene Liste bearbeiten, das könnte was bringen.

Vielleicht ist Dein Flaschenhals ja gar nicht das Iterieren an sich, sondern das Löschen? remove auf einer ArrayList ist ja nicht gerade schnell. Hast Du mal den Ansatz verfolgt, aus der alten Liste nur diejenigen Elemente in eine neue Liste zu übernehmen, die Deinen Kriterien entsprechen?
Code:
class Beispiel
{
	private static List<String> filter(List<String> list)
	{
		List<String> result = new ArrayList<String>();
		for (String s: list)
		{
			if (s.length() >= 5)
				result.add(s);
		}
		return result;
	}

	public static void main(String[] args)
	{
		List<String> list = new ArrayList<String>();
		list.add("1");
		list.add("12");
		list.add("123");
		list.add("1234");
		list.add("12345");
		list.add("123456");
		list.add("1234567");
		list.add("12345678");
		list.add("123456789");
		System.out.println(list.size());
		list = filter(list);
		System.out.println(list.size());
	}
}
 

SchonWiederFred

Bekanntes Mitglied
Das Filtern kann man natürlich auch schön generisch und wiederverwendbar machen:

Code:
interface Filter<E>
{
	boolean keep(E e);
}

class Beispiel
{
	public static <E> List<E> filter(List<? extends E> list, Filter<? super E> filter)
	{
		List<E> result = new ArrayList<E>();
		for (E e: list)
			if (filter.keep(e)) result.add(e);
		return result;
	}

	public static void main(String[] args)
	{
		List<String> list = new ArrayList<String>();
		list.add("1");
		list.add("12");
		list.add("123");
		list.add("1234");
		list.add("12345");
		list.add("123456");
		list.add("1234567");
		list.add("12345678");
		list.add("123456789");
		System.out.println(list.size());
		list = filter(list, new Filter<String>()
		{
			public boolean keep(String e)
			{
				return e.length() >= 5;
			}
		});
		System.out.println(list.size());
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
P Wie mehreren Threads Aufgaben zuweisen und abarbeiten lassen? Java Basics - Anfänger-Themen 15
L Zeit stoppen in mehreren Threads Java Basics - Anfänger-Themen 2
F aus mehreren Programmen ein Programm mit Threads machen Java Basics - Anfänger-Themen 7
G Problem mit mehreren Threads und Buttons Java Basics - Anfänger-Themen 3
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7
N Pingen in Threads Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben