java的linkedlist多线程使用

J2EE 码拜 6年前 (2015-04-17) 1230次浏览 0个评论

这是个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 类();的方式也是可以不用等该类执行完程序就会自动执行后面代码吗???

java的linkedlist多线程使用
5分
好长的一段代码啊,我感觉好像是主线程的删除操作都完成了,添加的线程还在跑
java的linkedlist多线程使用
应该不会啊,我在遍历前通过System.out.println(linkedList.list.size());已经能够显示正常数据了的,而且又使用 try {
     Thread.sleep(50);
                } 
   catch (InterruptedException e) {}来增加主程序运行时间,不可能添加那几个数据要那么长时间吧,不知道你那里的运行结果如何呢,知道什么原因吗
java的linkedlist多线程使用
我把linkedList.list.remove(i);删除指定节点的语句注释掉以后,程序遍历正常显示了所有满足要求的节点,我怀疑可能是linkedlist的遍历问题,当我只要删除其中的某个节点之后,可能遍历的顺序就出现了变化了
java的linkedlist多线程使用
10分
我只知道你的thred类木有写run方法。。。
java的linkedlist多线程使用
对,那里是有错误,是应该用run,但那不是主要问题,现在找到问题了,就是我上面说的遍历删除的原因,对linkedlist的遍历的过程中是不能够进行删除的,有删除操作就会出现错误,可以参考博文:http://www.cnblogs.com/frankliiu-java/articles/1759460.html
java的linkedlist多线程使用
20分
引用 5 楼 u011739410 的回复:

对,那里是有错误,是应该用run,但那不是主要问题,现在找到问题了,就是我上面说的遍历删除的原因,对linkedlist的遍历的过程中是不能够进行删除的,有删除操作就会出现错误,可以参考博文:http://www.cnblogs.com/frankliiu-java/articles/1759460.html

如果一定要在遍历过程中删除,可以将for (int i = 0; i < linkedList.list.size(); i++) 改为for (int i = linkedList.list.size()-1; i >=0 ; i–) 

java的linkedlist多线程使用
引用 6 楼 oh_Maxy 的回复:
Quote: 引用 5 楼 u011739410 的回复:

对,那里是有错误,是应该用run,但那不是主要问题,现在找到问题了,就是我上面说的遍历删除的原因,对linkedlist的遍历的过程中是不能够进行删除的,有删除操作就会出现错误,可以参考博文:http://www.cnblogs.com/frankliiu-java/articles/1759460.html

如果一定要在遍历过程中删除,可以将for (int i = 0; i < linkedList.list.size(); i++) 改为for (int i = linkedList.list.size()-1; i >=0 ; i–) 

谢谢啊,按您的代码程序运行正常了。问题处理好了,现在在弄AES加密的东西,需要用的是128位的CFB模式的AES加密方式,在网上找了下,AES加密的java代码有些,但好像没有找到CFB模式下的128位的代码,应该每个模式的代码实现都不一样,不知道你有相关代码实现的吗,初学java自己编写好像不太现实的??

java的linkedlist多线程使用
5分
引用 7 楼 u011739410 的回复:
Quote: 引用 6 楼 oh_Maxy 的回复:
Quote: 引用 5 楼 u011739410 的回复:

对,那里是有错误,是应该用run,但那不是主要问题,现在找到问题了,就是我上面说的遍历删除的原因,对linkedlist的遍历的过程中是不能够进行删除的,有删除操作就会出现错误,可以参考博文:http://www.cnblogs.com/frankliiu-java/articles/1759460.html

如果一定要在遍历过程中删除,可以将for (int i = 0; i < linkedList.list.size(); i++) 改为for (int i = linkedList.list.size()-1; i >=0 ; i–) 

谢谢啊,按您的代码程序运行正常了。问题处理好了,现在在弄AES加密的东西,需要用的是128位的CFB模式的AES加密方式,在网上找了下,AES加密的java代码有些,但好像没有找到CFB模式下的128位的代码,应该每个模式的代码实现都不一样,不知道你有相关代码实现的吗,初学java自己编写好像不太现实的??

没有。。自己搜搜看吧。。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java的linkedlist多线程使用
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!