当前位置: 首页 > 面试题库 >

Java访问不同线程中的对象

郎飞航
2023-03-14
问题内容

我已经搜索了很多,但找不到特定的解决方案。关于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();
    }
}

还有其他方法吗?


问题答案:

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


Collection.synchronizedList(yourPlainList)



 类似资料:
  • 问题内容: 假设我有一个与field共享的对象。多个线程将共享对该对象的引用以访问该字段。但是,线程永远不会同时访问对象。我需要声明为volatile吗? 这样的情况如下: 一个类定义一个唯一字段和一个方法。 一个线程使计数器递增,然后生成另一个使计数器递增的线程,依此类推。 鉴于程序的逻辑,因此无法并发访问计数器。但是,计数器是在多个线程之间共享的。计数器必须波动吗? 的情况的另一个变体是当多个

  • 问题内容: 我正在阅读同步工作。这是示例: 让假定有两个线程和正在访问的方法,如果线程是块则线程将跳过该块,执行下一个块/语句或将等待/阻塞,直到线程离开 块。 第二是什么,为什么在参数中以及什么时候可以 下面是真的吗? 内在锁在对象上: 如果线程A在其中,则无法输入或任何其他同步方法。 问题答案: 1:线程B将等待,直到线程A释放对同步对象的锁定之后,线程A将释放对同步对象的锁定并执行代码。 2

  • 我在读同步工作。下面是一个例子: 假设两个线程 和 正在访问 方法,如果线程 位于块中,则线程 将跳过该块并执行下一个块/语句,或者将等待/阻止,直到线程 离开块。 第二,什么是< code>synchronized参数中的< code>Singleton.class以及它何时可以为< code>null 下面的<code>语句 内部锁位于对象上: 如果线程A位于中,则无法输入或任何其他同步方法。

  • 当我写异步方法时: 我的连续 () 有可能不在同一线程中执行,而不是我的序幕 ()。想象一下,调用方线程是游戏的绘制线程。然后,如果我的Prologue()从myGameObjects数组中更改了非原子对象,并且myContinuation()也使用它们,那么我们就可以从2个线程到对象/数组进行非同步访问,这可能会损坏它们。 是真的还是异步/等待在这种情况下有一些同步的东西?或者我应该避免使用Co

  • 我有一个很大的json文件,其中包含一个很长的信息列表,我需要在许多子线程中只读该列表。 在java中,我们可以只通过值而不是引用来传递变量,我希望在内存/磁盘使用方面尽可能减少我的程序。 现在我将完整的列表或它的子列表传递给我创建的每个线程。 有没有一种方法可以从所有线程访问相同的列表变量,而不将完整的列表复制到每个线程中? 我需要“只读取”列表 下面是我的程序是如何工作的 1-服务(等待文件创

  • 问题内容: 代码段-1 代码段-2 尽管第二个代码段在不引起任何竞争条件的情况下运行良好,但第一个代码段未能成功同步同一类的不同实例(RequestObject)之间对静态数据成员的访问。有人可以对此进行更多说明。我想了解为什么第一种方法不起作用。 问题答案: 您将不断创建新的对象,然后对其进行同步,这至少使考虑它变得非常混乱。这样就可以得到以下情况: 线程A保持当前值(假设为0) 线程B排队等待