这是个linkedlist作为共享区,多线程访问的代码,已经使用了Collections.synchronizedList方法防止多线程的问题,执行后遍历输出没有问题,但是使用删除指定对象,却一直删除不干净,不知道为什么??如下所示:
package linkedList;
import java.util.*;
import linkedList.linkedList.PhoneList;
public class linkedList {
public static List<PhoneList> list ;
public static void main(String [] agrs){
list = Collections.synchronizedList(new ArrayList<PhoneList>());
new thread("1317").start();
new thread("1316").start();
new thread("1512").start();
try {
Thread.sleep(50);
}
catch (InterruptedException e) {}
System.out.println(linkedList.list.size());
for (int i = 0; i < linkedList.list.size(); i++) {
if(((linkedList.list.get(i)).phoneNumList).equals("1316")){
System.out.println((linkedList.list.get(i)).phoneNumList);
linkedList.list.remove(i); //这里删除所有"1316"的节点,但是执行结果却只删除一部分,还有部分不删除,不知道为什么
}
}
System.out.println(".............................");
for (int i = 0; i < linkedList.list.size(); i++) {
System.out.println((linkedList.list.get(i)).phoneNumList);
}
}
public static class PhoneList
{
public String phoneNumList;
public int num;
public PhoneList(String phoneNumList,int num) {
this.phoneNumList = phoneNumList;
this.num = num;
}
}
}
class thread extends Thread{
String a;
PhoneList element;
thread(String a){
this.a = a;
}
public void start()
{
for(int i = 0;i<3;i++){
element = new PhoneList(a,i);
synchronized(linkedList.list){
linkedList.list.add(element);
try {
Thread.sleep(50);
}
catch (InterruptedException e) {}
}
}
}
}
>>>>>>>>>>>>>>这是执行结果>>>>>>>>>>>>>>>>>>>>>>>>
9
1316
1316
.............................
1317
1317
1317
1316
1512
1512
1512 后面还有一个残留的1316,不知道是什么原因,我在遍历的前面已经用了Thread.sleep(50);给线程足够的执行时间了,但还是出现这样的结果。
附:再问下多线程执行过程中,创建新线程后,是在执行新线程的过程中,程序就执行后面代码了,不用等到新线程执行完吧,如果我创建的是一个方法类,使用new 类();的方式也是可以不用等该类执行完程序就会自动执行后面代码吗???
------解决方案--------------------
好长的一段代码啊,我感觉好像是主线程的删除操作都完成了,添加的线程还在跑
------解决方案--------------------
我只知道你的thred类木有写run方法。。。
------解决方案--------------------
如果一定要在遍历过程中删除,可以将for (int i = 0; i < linkedList.list.size(); i++) 改为for (int i = linkedList.list.size()-1; i >=0 ; i--)
------解决方案--------------------
没有。。自己搜搜看吧。。