小编典典

Java访问不同线程中的对象

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对象。有人可以详细说明吗?

实现此目标的最佳方法是什么?

要求是,如果一个线程最后插入一个元素,则另一个线程应该能够同时删除另一个索引(例如第二个)中的某个元素。

编辑

我已经完成了以下工作:谢谢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();
    }
}

还有其他方法吗?


阅读 213

收藏
2020-11-01

共1个答案

小编典典

使用 同步列表 ,这将是线程安全的


Collection.synchronizedList(yourPlainList)

2020-11-01