Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
[Threads]: Mit mehreren Threads 1 ArrayList durchlaufen
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 :-(
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.
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?
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 ...
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?!
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
Ansonsten kann man nur wage antworten:
2 Threads erstellen und beide auf einen Iterator losschicken, die ConcurrentModificationException sehen und eine andere Lösung suchen...
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());
}
}