Я искал много, но не смог найти конкретное решение. Есть также некоторые вопросы относительно этого в stackoverflow, но я не могу найти удовлетворительный ответ, поэтому я спрашиваю его снова.java доступ к объекту в разных потоках
У меня есть класс, как указано в java. Я знаю, как использовать потоки в 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
}
}
теперь я хочу, чтобы сделать эти две операции одновременно. для этого я создал два потока, один из которых выполняет addString() логику в run, а другой выполняет deleteString() logic.i передаёт mylist в конструкторе каждого потока, но как я могу вернуть объект после выполнения добавления и удаления в mylist?
Прежде чем я подумал, что «если я передаю mylist в конструкторе потока, он передает адрес mylist в поток и поток выполняет операции над ним, которые меняются, ссылаются на объект mylist». Но это не так, как изменения не отражены в объекте mylist. может ли кто-нибудь это сформулировать?
Каков наилучший способ достичь этого?
Требование подобно этому, если поток вставляет элемент, наконец, другой поток должен иметь возможность удалять некоторый элемент в другом индексе, скажем, второй одновременно.
EDIT
я сделал это следующим образом: Thanx к Энно 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();
}
}
есть ли другой способ сделать это?
Можете ли вы показать, как вы делаете темы и как вы пытаетесь вставить и удалить значение? – gprathour
Ваш вопрос очень запутан. Вы описали класс 'myclass', но не один раз упоминаете об этом в своем вопросе. 'mylist' - это просто список с' add' и 'remove', для чего вам нужен' myclass'? Более важно увидеть код, который вы используете для создания потоков и кода, который использует 'add' и' delete'. –
@AlexGitelman см. В редакторе –