论坛首页 Java版 企业应用

对ConcurrentLinkedQueue进行的并发测试

浏览 1208 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-04-05
我在一个短信点播项目中应用到了ConcurrentLinkedQueue这个类,因为在开发之前,要求处理能力要好,每秒钟短信大约上行30左右,所以我选择了多线程序并发模式,比如有两个收短信的线程同时向一个ConcurrentLinkedQueue中add,有30个业务处理线程同是对这个ConcurrentLinkedQueue进行poll操作,因为ConcurrentLinkedQueue是线程序安全的并且是针对并发的,所以一直认为30个线程一定比一个快,当时项目急没做测试,现在做一个,发现了问题!

主类

public class conn{
	public static void main(String[] args) throws Exception{
		Queue<String> queue=new ConcurrentLinkedQueue<String>();
		for(int i=0;i<1000000;i++){
		   queue.add(String.valueOf(i));
		}
		int num=10;//线程人个数
		for(int i=0;i<num;i++){
		   new ThreadConn(queue);
		}

	}
}

线程类
public class ThreadConn implements Runnable{
	Queue<String> queue;
	public ThreadConn(Queue<String> queue){
		this.queue=queue;
		Thread thread=new Thread(this);
		thread.start();
	}
	public void run(){
		try{
			long sd=new Date().getTime();
			while(queue.poll()!=null){
	                      //这里是业务逻辑
			}
			System.out.println (sn-sd);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}


测试结果如下:
启动10个线程
31
0
0
0
0
500
390
297
0
0
启动1个线程
360

10还没有1个快,因为当前没有看过ConcurrentLinkedQueue这个类,现在看了一下,原来poll也是要有等待算法的,也就是说,如果poll这后的业务逻辑运行时间小的话,多线程序没有任何意义,反之如果poll这后的业务逻辑运行时间相当于Thread.sleep(1);哈哈,多线程确实起作用!
   
最后更新时间:2007-07-20
引用
10还没有1个快,因为当前没有看过ConcurrentLinkedQueue这个类,现在看了一下,原来poll也是要有等待算法的,也就是说,如果poll这后的业务逻辑运行时间小的话,多线程序没有任何意义,反之如果poll这后的业务逻辑运行时间相当于Thread.sleep(1);哈哈,多线程确实起作用!

这个类是线程安全的 在poll的时候获得对象锁 执行完之后释放 还有等待算法?
   
0 请登录后投票
最后更新时间:2007-07-21
MS多线程不是用来加速的,只是更有效利用被阻塞时间而已,你在业务逻辑加上外部IO再试试
   
0 请登录后投票
最后更新时间:2007-07-21
Sam1860 写道
MS多线程不是用来加速的,只是更有效利用被阻塞时间而已,你在业务逻辑加上外部IO再试试

没错 减少一个线程对cpu的独占时间 让多个线程轮换使用cpu 提高cpu的使用率
   
0 请登录后投票
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐