java access an object in different threads(java在不同的线程中访问一个对象)
问题描述
我搜索了很多,但找不到特定的解决方案.在stackoverflow上也有一些关于此的问题,但我无法找到令人满意的答案,所以我再次询问.
I have searched a lot but not able to find particular solution. There are also some question regarding this on stackoverflow but i am not able to find satisfactory answer so i am asking it again.
我在 java 中有一个类如下.我知道如何在 java 中使用线程.
I have a class as follow in java . I know how to use threads in 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 执行添加和删除后如何返回对象?
now i want to do these two operations simultaneously. for that i have created two thread class one performs addString() logic in run and another perform deleteString() logic.i am passing mylist in the constructor of each thread but how can i return an object after performing addition and deletion to mylist?
在我认为如果我在线程的构造函数中传递 mylist 时,它会将 mylist 的地址传递给线程,并且线程对其执行操作,这些更改引用 mylist 对象"但事实并非如此,因为更改不反映到 mylist 对象.有人可以详细说明吗?
Before i was thinking that "If i am passing the mylist in constructor of thread it passes the address of the mylist to thread and thread performs operations on it that changes refer to mylist object" But it is not like that as the changes are not reflacted to mylist object . can any one elaborate this?
实现这一目标的最佳方法是什么?
what is the best way to achieve this?
要求就像如果一个线程最后插入一个元素,另一个线程应该能够同时删除另一个索引处的某个元素,比如第二个.
the requirement is like that if a thread is inserting an element at last another thread should be able to delete some element at other index say 2nd simultaneously.
编辑
我已经这样做了:thanx to Enno Shioji
i have done it as follow: thanx to 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();
}
}
还有其他方法吗?
推荐答案
使用同步列表,这样会是线程安全的
Use Synchronized List , It would be thread safe
使用 Collection.synchronizedList(yourPlainList)
这篇关于java在不同的线程中访问一个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:java在不同的线程中访问一个对象
基础教程推荐
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01