java accéder à un objet dans différents threads
J'ai beaucoup cherché mais n'a pas pu trouver de solution particulière. Il y a aussi quelques question à ce sujet sur stackoverflow mais je n'arrive pas à trouver de réponse satisfaisante donc, je demande à nouveau.
J'ai une classe de suivre en java . Je sais comment utiliser les threads en 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
}
}
maintenant je veux faire ces deux opérations en même temps. pour ce que j'ai créé deux classe thread exécute addString() logique dans la course et un autre effectuer deleteString() logique.je suis de passage maliste dans le constructeur de chaque fil, mais comment puis-je retourner un objet après l'exécution de l'ajout et la suppression de mylist?
Avant, je pensais que "Si je suis de passage le maliste dans le constructeur de fil, elle passe l'adresse de la maliste de fil de fil et d'effectuer des opérations sur ce que les changements se référer à ma liste d'objet", Mais il n'est pas comme ça que les modifications ne sont pas reflacted à ma liste d'objet . peut-on élaborer?
quelle est la meilleure façon d'atteindre cet objectif?
l'exigence est comme si un fil est l'insertion d'un élément lors de la dernière un autre thread devrait être en mesure de supprimer un élément à l'autre de l'indice de dire 2ème simultanément.
MODIFIER
j'ai fait comme suit: merci à 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();
}
}
est-il un autre moyen pour le faire?
Votre question est extrêmement déroutant. Vous avez décrit la classe
myclass
mais pas une fois que vous le mentionnez dans votre question. mylist
est simplement une liste avec add
et remove
, de quoi avez-vous besoin myclass
? Il est plus important de voir le code que vous utilisez pour créer des threads et le code qui utilise add
et delete
.veuillez voir le modifier
Dans votre montage, je pense que vous pouvez faire addString() et deleteString() synchronisée méthodes toujours utiliser un simple ArrayList pour mylist. Corrigez-moi si je me trompe.
OriginalL'auteur Hemant Metalia | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
Utilisation Synchronisé Liste , Il serait thread-safe
Utilisation
de la Collection.synchronizedList(yourPlainList)
Je pense qu'il demandait pour les opérations simultanées sur les données, ce qui n'est pas réalisable avec arraylists, parce qu'ils sont soutenus par la plaine des tableaux. Il veut un CopyOnWriteArrayList
Votre liste est partagée doit être synchronisé juste
merci
qui ne compile pas,
synchronized
n'est pas un modificateurOriginalL'auteur Jigar Joshi
Fils et de l'instance de l'objet sont des concepts différents. Si vous souhaitez partager des données entre threads, vous devez accéder à une seule instance de l'objet à partir de deux fils. Dans ce cas, vous devriez faire quelque chose comme cela.
et puis
Notez comment vous faites référence à la même instance d'objet (
mine
) à partir de deux fils. Notez également que j'ai ajouté lesynchronized
mot-clé pour faireMyClass
thread-safe. Cela oblige toutes les opérations à faire de façon séquentielle plutôt que de vraiment "simultanément". Si vous voulez un vrai opérations simultanées sur la collection, vous aurez besoin d'utiliser simultanés des structures de données comme un Saut de Liste et de se débarrasser desynchronized
mot-clé.OriginalL'auteur Enno Shioji