一个任务队列的BlockingQueue实现

一、Concurrent简单介绍

Concurrentjdk1.5推出来的对多线程实现的进一步封装,它大大的简化了多线程开发。concurrent包分成了三个部分,分别是java.util.concurrentjava.util.concurrent.atomicjava.util.concurrent.lock。内容涵盖了并发集合类、线程池机制、同步互斥机制、线程安全的变量更新工具类、锁等等常用工具。

       Executor:具体Runnable任务的执行者。

ExecutorService:一个线程池管理者,其实现类有多种,比如普通线程池,定时调度线程池ScheduledExecutorService等,我们能把一个

Runnable,Callable提交到池中让其调度。

Future:是与Runnable,Callable进行交互的接口,比如一个线程执行结束后取返回的结果等等,还提供了cancel终止线程。

BlockingQueue:阻塞队列。

 

 

 

二、一个任务队列的BlockingQueue实现

 

public int FetchInvertal = 1000;
public Datum newdatum = null;
// Creates a LinkedBlockingQueue with a capacity of Integer.MAX_VALUE.
// 理论上Integer.MAX_VALUE.的任务排队
final BlockingQueue<Datum> queue = new LinkedBlockingQueue<Datum>();
// 线程池
// 其中一个线程,取出待处理资料,put到queue
// 其余四个线程处理具体业务
final ExecutorService fetchdataservice = Executors
				.newSingleThreadExecutor();
final ExecutorService convertservice = Executors.newFixedThreadPool(4);
//计数
final AtomicInteger wc = new AtomicInteger();
final AtomicReference<String> atomstarttime=new AtomicReference<String>(null);
// FetchList线程
Runnable fetchlist = new Runnable() {
public void run() {
while (true) {
	try {
		List<Datum> tmpls = getLatestDatums("1", tomstarttime.get());
		if (tmpls != null && tmpls.size() > 0) {
		queue.addAll(tmpls);
		atomstarttime.set(tmpls.get(tmpls.size() - 1).getAddtime());
		tmpls=null;
		}
// 每隔一秒钟就检测一下是否有新的待处理的数据
		Thread.sleep(FetchInvertal);
		} catch (InterruptedException ex) {
	}
}
}
};
fetchdataservice.submit(fetchlist);
fetchdataservice.shutdown();

// 四个处理线程
for (int index = 0; index < 4; index++) {
		Runnable exewrite = new Runnable() {
		public void run() {
		int port = 8100 + wc.getAndIncrement();
		while (true) {
		try {
//如果队列里没有数据,会自动退出当前进程,为了防止进程被停掉,先判断是否有任务队列 
//队列里去看有没有任务,一直循环。
			if (queue.size() > 0) {
					Datum datum = queue.take();
					if (datum != null) {
					if (dobiz==true) {//此条件是伪码
										// 若成功,自动审核通过
						updateDatumState(datum.getUuid(), "3");
					} else {
						// 若不成功,自动审核不通过
						updateDatumState(datum.getUuid(), "2");
					}
				}
			} else {
					Thread.sleep(2000);//如果队列里没有任务了,睡眠两秒
			}
		} catch (InterruptedException e) {
	}
}
}
};
convertservice.submit(exewrite);
}
convertservice.shutdown();
}

private List<Datum> getLatestDatums(String status, String starttime) {
		//返回最新产生的待处理的任务列表
	}

private String updateDatumState(String uuid, String status) {
		//更新当前任务状态,打上已处理完成,或处理异常的标志
	}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值