`

多线程之ConcurrentLinkedQueue

 
阅读更多
ConcurrentLinkedQueue用法

package com.cn.test1;

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 此需求的特点:先进进出 ,
 * 多线程处理  ConcurrentLinkedQueue应用
 * pop()  
 * 考虑下列需求:典型的生产者消费者模块 先进先出原则
 */
public class Test {
	
	
	public static void main(String[] args) {
		Test t  = new Test() ;
		t.inportExcel(20000) ;
		
	}
	
	/**
	 * 模拟生成需要导入的数据
	 * @param size
	 * @return
	 */
	public List<String> initData(int size){
		List<String> data = new ArrayList<String>() ;
		for(int i = 1 ; i<size ; i++){
			data.add("Object-"+i) ;
		}
		return data ;
	}
	
	public void inportExcel(int size){
		long t1 = System.currentTimeMillis() ;
		try {
			List<String> data = initData(size) ;
			Queue<String> queue = new ConcurrentLinkedQueue<String>(data);
			int poolSize = queue.size()<20?1:200;
			ExecutorService pool = Executors.newFixedThreadPool(poolSize);
			
			
			BatchAddWeakPasswordResult result = new BatchAddWeakPasswordResult();
			Count ctn = new Count(data.size());
			Object o = new Object();
			
			for(int i=0;i<poolSize;i++){
				Thread t = new AddPWDThread(queue,result,o, ctn);
				pool.execute(t);
			}
			synchronized(o){
				if((!pool.isTerminated() && ctn.i!=0) || queue.isEmpty() ){
					o.wait(1000*60);
				}
			}
			//任务处理完成关掉线程池
			pool.shutdown() ;
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		long t2 = System.currentTimeMillis() ;
		System.out.println("导入花费时间:(毫秒)"+ (t2 - t1));
	}
	/**
	 * 计数器
	 * @author Administrator
	 *
	 */
	class Count{
		int i = 0;
		public Count(int i){
			this.i = i;
		}
		
		public void add(){
			i++;
		}
		
		public void sub(){
			i--;
		}
		
		public int size(){
			return i;
		}
	}
	
	/**
	 * 导入线程
	 * @author Administrator
	 *
	 */
class AddPWDThread extends Thread {
		
		private Queue<String> queue;
		private BatchAddWeakPasswordResult result;
		private Object o;
		private Count size;
		
		public AddPWDThread(Queue<String> queue,BatchAddWeakPasswordResult result,Object o,Count size){
			this.queue = queue;
			this.result = result;
			this.o = o;
			this.size = size;
		}
	    @Override
	    public void run() {
	    	try {
				Thread.sleep(500) ;
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
	    	//System.out.println("###############"+Thread.currentThread().getName() + "正在执行。。。");
	    	//while(queue.size() > 0){//不要用size()方法 ,会造成遍历队列 非常耗时
	    	while(!queue.isEmpty()){
    			String webSysWeakpassword = queue.poll();
    			if(webSysWeakpassword!=null){
			    	try{
			    		long t1 = System.currentTimeMillis();
					//	System.out.println(Thread.currentThread().getName() + "插入对象 "+webSysWeakpassword+" 到数据库 ");
						result.addResultMap(webSysWeakpassword, "SUCCESS",true);
					//	System.out.println("############## add pwd use time " +(System.currentTimeMillis()-t1) + "ms");
					}catch(Exception e){
						result.addResultMap(webSysWeakpassword, "ERROR",false);
					}finally{
						synchronized(o){
							size.sub();
							if(size.size() == 0){
								o.notifyAll();
							}
							//System.out.println("###############"+Thread.currentThread().getName() + " thread notify at "+result.getResultMap().size());
						}
					}
    			}
	    	}
	    }
	}

}



package com.cn.test1;

import java.util.HashMap;
import java.util.Map;

/**
 * 继承成功多少条,失败多少条
 *
 */
public class BatchAddWeakPasswordResult {
	
	private int successCount = 0;
	private int failsCount = 0;
	private Map<String,String> resultMap = new HashMap<String,String>();
	
	public int getSuccessCount() {
		return successCount;
	}
	public void setSuccessCount(int successCount) {
		this.successCount = successCount;
	}
	public int getFailsCount() {
		return failsCount;
	}
	public void setFailsCount(int failsCount) {
		this.failsCount = failsCount;
	}
	public Map<String, String> getResultMap() {
		return resultMap;
	}
	public void setResultMap(Map<String, String> resultMap) {
		this.resultMap = resultMap;
	}
	
	public void addSuccessCount(){
		successCount++;
	}
	
	public void addFailsCount(){
		failsCount++;
	}
	
	public void addResultMap(String key,String value,boolean isSuccess){
		synchronized(this){
			resultMap.put(key, value);
			if(isSuccess){
				addSuccessCount();
			}else {
				addFailsCount();
			}
		}
	}
}
分享到:
评论

相关推荐

    Java 线程 ? ConcurrentLinkedQueue

     2、再考虑多线程时候的offer:  · 多个线程offer  · 部分线程offer,部分线程poll  · offer比poll快  · poll比offer快  offer public boolean offer(E e) { checkNotNull(e); // 新建一个node ...

    精通java多线程

    Java的并发集合库(java.util.concurrent包)提供了线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList和ConcurrentLinkedQueue等,它们在多线程环境下能确保数据的一致性和安全性。 十、异常处理 在多...

    JAVA-多线程 所有文件

    13. **并发集合**:Java并发库提供了一些线程安全的集合,如`ConcurrentHashMap`, `CopyOnWriteArrayList`, `ConcurrentLinkedQueue`等,它们在多线程环境下表现更优。 在实际项目中,理解和熟练运用这些多线程知识...

    多线程 队列利用

    3. **并发容器**:Java的`java.util.concurrent`包提供了多种并发队列,如`ArrayBlockingQueue`、`LinkedBlockingQueue`和`ConcurrentLinkedQueue`等,它们为多线程环境提供了高效的队列操作。 4. **工作窃取算法**...

    Java 多线程与并发(15-26)-JUC集合- ConcurrentLinkedQueue详解.pdf

    ### Java多线程与并发(15-26)-JUC集合-ConcurrentLinkedQueue详解 #### 一、ConcurrentLinkedQueue概述 `ConcurrentLinkedQueue`是Java实用工具包(J.U.C)中的一个高性能线程安全队列,主要用于解决多线程环境下...

    java多线程编程

    视频教程中可能涵盖了线程安全的数据结构,如ArrayList和LinkedList在多线程环境下的问题,以及如何使用CopyOnWriteArrayList和ConcurrentLinkedQueue等线程安全的集合。还可能涉及并发工具类,如AtomicInteger、...

    java 多线程 队列工厂

    Java并发库(`java.util.concurrent`包)提供了一系列优化的线程安全集合,如`ConcurrentLinkedQueue`、`ConcurrentHashMap`等,它们在多线程环境下性能优越,减少了对锁的依赖。 在`queueFactory`压缩包中,可能...

    ConcurrentLinkedQueue源码分析.rar

    头部和尾部指针在多线程环境下可能会并发修改,因此它们都是用原子引用(`AtomicReference`)类型存储的,确保在并发环境下的正确性。 总结起来,`ConcurrentLinkedQueue`是一个高性能、线程安全的无界并发队列,其...

    java多线程并发实战和源码

    Java多线程并发实战与源码分析是Java开发中至关重要的一部分,它涉及到程序性能优化、系统资源高效利用以及复杂逻辑的正确同步。本书主要聚焦于Java多线程的基础理论和实际应用,虽然书中实例和源码相对较少,但仍然...

    java多线程测试实例

    Java多线程是Java编程中的重要组成部分,尤其在并发编程领域,它扮演着核心角色。在实际项目中,多线程被广泛应用于提高系统效率、实现任务并行处理,以及优化资源利用。以下是对"java多线程测试实例"的详细解析: ...

    Java多线程聊天

    4. **线程安全的数据结构**:为了确保在多线程环境中数据的一致性,可以使用线程安全的数据结构,如`ConcurrentHashMap`、`ConcurrentLinkedQueue`等。在聊天室中,可能需要一个存储在线用户和他们消息的结构,这些...

    java并发(二十四)多线程结果组装

    在Java编程中,多线程是并发处理任务的关键技术,特别是在高性能、高并发的应用场景下。本篇将探讨“多线程结果组装”的主题,它涉及到如何在多个并发执行的任务完成后,有效地收集并整合这些任务的结果。这个过程...

    高并发多线程处理demo-java.rar

    在Java编程领域,高并发和多线程是关键的技术之一,尤其在服务器端应用和大数据处理中至关重要。这个"高并发多线程处理demo-java.rar"压缩包提供了一个实际的Java实现,展示了如何构建一个并发队列来接收数据,并...

    java多线程面试题和答案

    在Java编程领域,多线程是一项至关重要的技术,特别是在开发高效、响应迅速的应用程序时。以下是一些关于Java多线程的面试题及其答案,涵盖了基础概念、并发控制、线程安全以及性能优化等方面。 1. **什么是Java多...

    我总结的Java多线程程序设计

    Java提供了一些线程安全的数据结构,如`ConcurrentHashMap`, `ArrayList`s的线程安全版本`CopyOnWriteArrayList`, `ConcurrentLinkedQueue`等,可以在多线程环境中安全地使用。 六、线程局部变量 `ThreadLocal`类...

    多线程程序避免冲突的3条简单规则

    在多线程编程中,确保线程安全是至关重要的,因为并发执行的线程可能会对共享数据产生竞态条件,导致结果不可预测。本篇文章将根据提供的标题“多线程程序避免冲突的3条简单规则”来深入探讨如何在Java环境中有效...

    LinkedBlockingQueue 和 ConcurrentLinkedQueue的区别.docx

    在Java并发编程中,队列是一种重要的数据结构,尤其在多线程环境下的任务调度和数据传递中扮演着关键角色。LinkedBlockingQueue和ConcurrentLinkedQueue是Java并发包中两个常用的线程安全队列,它们各有特点,适用于...

    多线程接收文件例子

    在IT领域,多线程是一种常见且重要的编程技术,尤其在网络传输和文件处理中。标题“多线程接收文件例子”表明我们将探讨如何利用多线程来提高文件接收的效率和并发性。在这个场景中,多线程允许我们同时处理多个文件...

    java_Thread.rar_java 多线程_java多线程

    总之,Java多线程是Java程序员必须掌握的核心技能之一,它涉及到程序的并发性、性能优化以及资源管理等多个方面。通过"java_Thread.txt"这样的实例学习,可以帮助我们更好地理解和应用Java的多线程特性,提升我们的...

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

Global site tag (gtag.js) - Google Analytics