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();
}
}
}
}
分享到:
相关推荐
2、再考虑多线程时候的offer: · 多个线程offer · 部分线程offer,部分线程poll · offer比poll快 · poll比offer快 offer public boolean offer(E e) { checkNotNull(e); // 新建一个node ...
Java的并发集合库(java.util.concurrent包)提供了线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList和ConcurrentLinkedQueue等,它们在多线程环境下能确保数据的一致性和安全性。 十、异常处理 在多...
13. **并发集合**:Java并发库提供了一些线程安全的集合,如`ConcurrentHashMap`, `CopyOnWriteArrayList`, `ConcurrentLinkedQueue`等,它们在多线程环境下表现更优。 在实际项目中,理解和熟练运用这些多线程知识...
3. **并发容器**:Java的`java.util.concurrent`包提供了多种并发队列,如`ArrayBlockingQueue`、`LinkedBlockingQueue`和`ConcurrentLinkedQueue`等,它们为多线程环境提供了高效的队列操作。 4. **工作窃取算法**...
### Java多线程与并发(15-26)-JUC集合-ConcurrentLinkedQueue详解 #### 一、ConcurrentLinkedQueue概述 `ConcurrentLinkedQueue`是Java实用工具包(J.U.C)中的一个高性能线程安全队列,主要用于解决多线程环境下...
视频教程中可能涵盖了线程安全的数据结构,如ArrayList和LinkedList在多线程环境下的问题,以及如何使用CopyOnWriteArrayList和ConcurrentLinkedQueue等线程安全的集合。还可能涉及并发工具类,如AtomicInteger、...
Java并发库(`java.util.concurrent`包)提供了一系列优化的线程安全集合,如`ConcurrentLinkedQueue`、`ConcurrentHashMap`等,它们在多线程环境下性能优越,减少了对锁的依赖。 在`queueFactory`压缩包中,可能...
头部和尾部指针在多线程环境下可能会并发修改,因此它们都是用原子引用(`AtomicReference`)类型存储的,确保在并发环境下的正确性。 总结起来,`ConcurrentLinkedQueue`是一个高性能、线程安全的无界并发队列,其...
Java多线程并发实战与源码分析是Java开发中至关重要的一部分,它涉及到程序性能优化、系统资源高效利用以及复杂逻辑的正确同步。本书主要聚焦于Java多线程的基础理论和实际应用,虽然书中实例和源码相对较少,但仍然...
Java多线程是Java编程中的重要组成部分,尤其在并发编程领域,它扮演着核心角色。在实际项目中,多线程被广泛应用于提高系统效率、实现任务并行处理,以及优化资源利用。以下是对"java多线程测试实例"的详细解析: ...
4. **线程安全的数据结构**:为了确保在多线程环境中数据的一致性,可以使用线程安全的数据结构,如`ConcurrentHashMap`、`ConcurrentLinkedQueue`等。在聊天室中,可能需要一个存储在线用户和他们消息的结构,这些...
在Java编程中,多线程是并发处理任务的关键技术,特别是在高性能、高并发的应用场景下。本篇将探讨“多线程结果组装”的主题,它涉及到如何在多个并发执行的任务完成后,有效地收集并整合这些任务的结果。这个过程...
在Java编程领域,高并发和多线程是关键的技术之一,尤其在服务器端应用和大数据处理中至关重要。这个"高并发多线程处理demo-java.rar"压缩包提供了一个实际的Java实现,展示了如何构建一个并发队列来接收数据,并...
在Java编程领域,多线程是一项至关重要的技术,特别是在开发高效、响应迅速的应用程序时。以下是一些关于Java多线程的面试题及其答案,涵盖了基础概念、并发控制、线程安全以及性能优化等方面。 1. **什么是Java多...
Java提供了一些线程安全的数据结构,如`ConcurrentHashMap`, `ArrayList`s的线程安全版本`CopyOnWriteArrayList`, `ConcurrentLinkedQueue`等,可以在多线程环境中安全地使用。 六、线程局部变量 `ThreadLocal`类...
在多线程编程中,确保线程安全是至关重要的,因为并发执行的线程可能会对共享数据产生竞态条件,导致结果不可预测。本篇文章将根据提供的标题“多线程程序避免冲突的3条简单规则”来深入探讨如何在Java环境中有效...
在Java并发编程中,队列是一种重要的数据结构,尤其在多线程环境下的任务调度和数据传递中扮演着关键角色。LinkedBlockingQueue和ConcurrentLinkedQueue是Java并发包中两个常用的线程安全队列,它们各有特点,适用于...
在IT领域,多线程是一种常见且重要的编程技术,尤其在网络传输和文件处理中。标题“多线程接收文件例子”表明我们将探讨如何利用多线程来提高文件接收的效率和并发性。在这个场景中,多线程允许我们同时处理多个文件...
总之,Java多线程是Java程序员必须掌握的核心技能之一,它涉及到程序的并发性、性能优化以及资源管理等多个方面。通过"java_Thread.txt"这样的实例学习,可以帮助我们更好地理解和应用Java的多线程特性,提升我们的...
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...