BlockQueue使用之简单应用

本文介绍了一种使用Java的BlockingQueue实现日志记录的方法。当队列达到一定容量时,启动线程将日志写入文件,避免了因队列满而导致的阻塞问题。文中还探讨了如何通过异常处理确保数据不丢失。

 当然试了好几种,包括用add方法抛异常,用offer方法判断BlockQueue有没有满,但是感觉没有从根本上解决问题,于是就用了下面的方法,设置队列的容量是1000,当达到900的时候,就启用日志线程读取。


        /**

* 存储计数的信息

* @throws InterruptedException 

*/

@Override

public void add(String counter, String url) throws Exception {

if( true == urlInputLogFile ){ 

BlockingQueue<String> blockingQueue = countersMap.get(counter);

if(null == blockingQueue){

blockingQueue = new ArrayBlockingQueue<String>(1000);

blockingQueue.put(url);

countersMap.put(counter, blockingQueue);

this.add(counter);

}else{

this.add(counter);

        if(blockingQueue.size()==900){ //容量是1000等到满去写会阻塞    

    String date = DateFormatUtils.format(new Date(), "yyyyMMdd");

String name = counter+date+".log";

File rootPath = new File(this.getClass().getResource("/").getPath());

File path = new File(rootPath, urlInputLogFilePath);

if(!path.exists()){

path.mkdirs();

}

File file = new File(path,name);

if(!file.exists()){

file.createNewFile();

}

redisUrlLog.setLogFile(file);

redisUrlLog.setQueue(blockingQueue);

blockingQueue.add(url); //这里要再有异常,只好抛了,要不然就堵啊

countersMap.put(counter, blockingQueue);

   }else{

    countersMap.put(counter, blockingQueue);

   }

}

}else{

this.add(counter);

}

}

以上供大家一起学习有什么好想法,可以留言相互沟通。


转载于:https://my.oschina.net/u/2329222/blog/549073

k=length(blockqueue); for i=1:k blocklist=blockqueue(i).blocklist; if ~blockqueue(i).split %% line % 不用进行分割的线段直接赋值给控制点 tblk=blocklist(end,:); Vs = blockqueue(i).Ve; startflag=1; blk.type=tblk(1); if blk.type == 1 blk.ctrlpnt=[[tblk(2),tblk(3)];[tblk(4),tblk(5)]]; else blk.ctrlpnt=[[tblk(2),tblk(3)];[tblk(4),tblk(5)];[tblk(6),tblk(7)]]; end blk.knots=[]; blk.ids=[]; blk.us=[]; blk.ulist=[]; blk.curvlist=[]; destBlk=[destBlk;blk]; endflag = 0; % 终点向量 else if i~=k nextb=i+1; if ~blockqueue(nextb).split %% line % 下一段是直线,不需要进行拟合 Ve=blockqueue(nextb).Vs; Vs=blockqueue(i).Vs; endflag=1; end else Vs=blockqueue(i).Vs; Ve=blockqueue(i).Ve; % nextb=i+1; % if size(blockqueue) < nextb % 为空就需要用端点的切向量 % tblk=blocklist(end,:); % pe = [tblk(4), tblk(5), 0] - [tblk(6), tblk(7), 0]; % 起点 % ps = [tblk(2), tblk(3), 0] - [tblk(6), tblk(7), 0]; % 终点 % pe = pe / norm(pe); % ps = ps / norm(ps); % pn = cross(ps,pe); % 法向量 % % if tblk(8) < pi % Ve = cross(pn,pe); % 切向量 % else % Ve = -cross(pn,pe); % 切向量 % end % Ve = [Ve(1), Ve(2)]; % else % if ~blockqueue(nextb).split % 直线 % % else % % end % end end % if i == 1 % 第一段是圆弧 % tblk=blocklist(1,:); % pe = [tblk(4), tblk(5), 0] - [tblk(6), tblk(7), 0]; % 起点 % ps = [tblk(2), tblk(3), 0] - [tblk(6), tblk(7), 0]; % 终点 % pe = pe / norm(pe); % ps = ps / norm(ps); % pn = cross(ps,pe); % 法向量 % % if tblk(8) < pi % Vs = cross(pn,ps); % 切向量 % else % Vs = -cross(pn,ps); % 切向量 % end % Vs = [Vs(1), Vs(2)]; % end % blks = GetSplineBlk(blocklist,Vs,Ve,startflag,endflag);%%fit % 拟合 blks = GetSplineBlk_1(blocklist,Vs,Ve,startflag,endflag);%%fit % 拟合 destBlk=[destBlk;blks]; end end
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值