ich möchte einem Thread ein Arraylist übergeben, damit dieses abgearbeitet wird.
Ich dachte die Arraylist wird als neues Objekt übergeben und ich kann in der Main die Arraylist wieder löschen?
Java:
publicvoidonSenden(){if(channelValueList.isEmpty()){return;}Runnable r =newSendHTTP(channelValueList,getPropertyUrl(),getPropertyNodeid(),getPropertyApikey());newThread(r).start();
channelValueList.clear();}
Java:
publicSendHTTP(ArrayList<ChannelValue> channelValueList,String baseUrl,int nodeId,String apiKey){// store parameter for later userthis.channelValueList =newArrayList<ChannelValue>();this.channelValueList = channelValueList;System.out.println("Buffer Size im Konstruktor: "+this.channelValueList.size());this.baseUrl = baseUrl;this.nodeId = nodeId;this.apiKey = apiKey;}
Es scheint so als würde nur eine Referenz gesetzt, da in der Methode "SendHTTP" dann die channelValueList wohl wieder leer ist.
Dein erster Versuch hat nur die Referenz auf die Liste mitegegeben, dass heißt Änderungen im Caller sind auch im Callee sichtbar.
In deinem zweiten Versuch hast du eine neue Liste angelegt mit den selben Objekten darin. Das heißt beide Listen sind unabhängig voneinander.
Footer: Doch wenn du Objekte innerhalb der Listen änderst, dann sind sie in beiden Listen sichtbar.
Wenn du die Objekte tatsächlich komplett unabhängig haben willst könntest du mal darüber nachdenken das Objekt mit einem Objekt Output stream auf Platte zu schreiben und wieder einzulesen... Kostet was (an zeit) aber dann sollten Sie unabhängig voneinander sein
@CursedCookie Die Sachen auf Platte zu schreiben ist schon ziemlich teuer, da würde ich lieber ne DeepCopy im RAM machen. Oder eben alles in einen MemoryStream schreiben.
@Fohnbit Wenn du in der Main die Liste eh löschen willst, würde ich mir den Aufwand sparen die Liste zu kopieren und einfach in der main eine neue Liste erstellen:
Java:
publicvoidonSenden(){if(channelValueList.isEmpty()){return;}Runnable r =newSendHTTP(channelValueList,getPropertyUrl(),getPropertyNodeid(),getPropertyApikey());newThread(r).start();
channelValueList =newArrayList<>();}
@InfectedBytes hab ja gesagt dass das nicht gerade billig ist und ob es ihm das wert ist. Wenn er zu unmotiviert ist für eine kleine privat Anwendung eine deep copy zu implementieren, dann halte ich das für eine akzeptable Lösung. Wenn es nun um Geschwindigkeit geht ist er damit schlecht dran (je nachdem wie oft er es aufruft).
Man sollte sich halt fragen ob es zuviel programmier Aufwand ist für eine Übung in der es um etwas anderes geht, ob man viel Mühe in eine aufwendigere Implementierung stecken möchte, öde rob der Chef dir den Kopf abreißt wenn du das so machst ^^