java доступ к объекту в разных потоках

Я много искал, но не смог найти конкретного решения. Есть также некоторые вопросы по этому поводу в 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 ().я передаю mylist в конструкторе каждого потока, но как я могу вернуть объект после выполнения добавления и удаления в mylist?

Раньше я думал, что «Если я передаю mylist в конструкторе потока, он передает адрес mylist в поток, и поток выполняет над ним операции, изменения относятся к объекту mylist "Но это не так, поскольку изменения не отражаются на объекте mylist. кто-нибудь может это уточнить?

как лучше всего достичь этого?

требование такое, что если поток наконец вставляет элемент, другой поток должен иметь возможность удалить какой-то элемент с другим индексом, скажем, 2-й одновременно.

РЕДАКТИРОВАТЬ

Я сделал это следующим образом: спасибо Энно Сиодзи

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();
    }
}

, есть ли другой способ сделать это?

5
задан Hemant Metalia 9 February 2012 в 05:37
поделиться