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