多线程之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();
}
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值