java-Zugriff auf ein Objekt in verschiedenen threads
Gesucht hab ich viel, aber nicht in der Lage zu finden, insbesondere Lösung. Es gibt auch einige Frage bezüglich dieser auf stackoverflow, aber ich bin nicht in der Lage, um zufriedenstellende Antwort, also Frage ich es wieder.
Habe ich eine Klasse wie folgt in java . Ich wissen, wie die Verwendung von threads in java.
//please do not consider syntax if there is printing mistake, as i am typing code just for showing the concept in my mind
public class myclass{
private List<String> mylist=new ArrayList<String>();
public addString(String str){
//code to add string in list
}
public deleteString(String str){//or passing an index to delete
//code to delete string in list
}
}
jetzt möchte ich diese beiden Operationen gleichzeitig. für die, die ich erstellt habe zwei thread-Klasse führt man addString () - Logik in führen und andere führen deleteString () - Logik.ich bin vorbei mylist in den Konstruktor der einzelnen thread, aber wie kann ich ein Objekt zurückgeben, nach der Durchführung der Ergänzung und Löschung zu mylist?
Bevor ich dachte, dass "Wenn ich bin vorbei an den mylist im Konstruktor von thread übergibt die Adresse des mylist thread und thread führt Operationen auf Sie, die änderungen beziehen sich auf mylist-Objekt", Aber es ist nicht so, dass die änderungen nicht reflacted zu mylist-Objekt . kann einer aufwändigen diese?
was ist der beste Weg, dies zu erreichen?
Voraussetzung ist wie, wenn ein thread einfügen eines Elements am letzten anderen thread sollte in der Lage sein, löschen Sie ein element unter anderen index-sagen 2. gleichzeitig.
BEARBEITEN
ich habe es wie folgt aus: vielen Dank an Enno Shioji
public class myClass {
private List<String> mylist = Collections.synchronizedList(new ArrayList<String>());
public myClass(){
mylist.add("abc");
mylist.add("def");
mylist.add("ghi");
mylist.add("jkl");
}
public void addString(String str) {
mylist.add(str);
}
public void displayValues() {
for (int i = 0; i < mylist.size(); i++) {
System.out.println("value is " + mylist.get(i) + "at " + i);
}
}
public void deleteString(int i) {
mylist.remove(i);
}
}
class addThread {
public static void main(String a[]) {
final myClass mine = new myClass();
Thread t1 = new Thread() {
@Override
public void run() {
mine.displayValues();
mine.addString("aaa");
mine.displayValues();
}
};
Thread t2 = new Thread() {
public void run() {
mine.displayValues();
mine.deleteString(1);
mine.displayValues();
}
};
t1.start();
t2.start();
}
}
gibt es eine andere Möglichkeit, dies zu tun?
- Können Sie zeigen, wie Sie sind, die threads und wie Sie versuchen, zu löschen und einfügen von Werten ?
- Deine Frage ist sehr verwirrend. Sie beschrieben Klasse
myclass
aber nicht einmal Sie, erwähnen Sie es in Ihrer Frage.mylist
ist einfach eine Liste mitadd
undremove
, was Sie brauchenmyclass
für? Es ist wichtiger zu sehen-code, den Sie verwenden, um threads erstellen und code, der verwendetadd
unddelete
. - bitte siehe das edit
- In deinem edit, ich glaube, Sie können addString() und deleteString() synchronisierte Methoden, während immer noch verwenden Sie eine gewöhnliche ArrayList für mylist. Korrigieren Sie mich, wenn ich falsch bin.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Synchronisiert Liste , wäre Es thread-sicher
Verwenden
"Sammlung".synchronizedList(yourPlainList)
synchronized
ist kein modifierThreads und Objekt-Instanz werden verschiedene Konzepte. Wenn Sie möchten, zu teilen, Daten zwischen threads, die Sie benötigen Zugriff auf ein einzelnes Objekt-Instanz aus zwei threads. In diesem Fall sollten Sie so etwas tun.
dann
Beachten Sie, wie Sie beziehen sich auf die gleiche Objekt-Instanz (
mine
) aus den beiden threads. Beachten Sie auch, dass ich diesynchronized
keyword zu machenMyClass
thread-safe. Dies erzwingt, dass alle Operationen nacheinander ausgeführt werden, anstatt wirklich "gleichzeitig". Wenn Sie wollen echte, simultane Operationen auf die Sammlung, die Sie verwenden müssen, gleichzeitige Daten-Strukturen wie eine Skip-Liste und loszuwerdensynchronized
Stichwort.