Я много искал, но не смог найти конкретного решения. Есть также некоторые вопросы, касающиеся этого на stackoverflow, но я не могу найти удовлетворительный ответ, поэтому я спрашиваю его снова.
У меня есть класс, как следовать в 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 (), а другой выполняет deleteString () logic. Я передаю mylist в конструктор каждого потока, но как я могу вернуть объект после выполнения добавления и удаления в mylist?
Раньше я думал, что «если я передаю mylist в конструктор потока, он передает адрес mylist в поток, и поток выполняет над ним операции, которые изменяют ссылку на объект mylist». Но это не так, как изменения не отражаются на объекте mylist. Кто-нибудь может уточнить это?
Каков наилучший способ достичь этого?
требование таково, что если поток наконец-то вставляет элемент, другой поток должен иметь возможность удалить какой-либо элемент с другим индексом, например, 2-й одновременно.
EDIT
Я сделал это следующим образом: спасибо Энно Сиоджи
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();
}
}
есть ли другой способ сделать это?