您的位置:首页 > 其它

executors和executorService使用例子

2011-10-21 11:00 302 查看
一。 executors以及executorService的调用例子。

log.info("service start.");
ExecutorService service = Executors.newFixedThreadPool(maxThreadNum);
final CountDownLatch signal=new CountDownLatch(maxThreadNum);
for (int i = 0;i < resList.size();i++){
service.submit(new QueryMobileBalanceRunnableTask(mobileBalanceService,(List<MobileBalance>)resList.get(i),signal));
}

try {
signal.await();
} catch (InterruptedException e) {
log.warn("doMultiThreading Interrupted.",e);
return;
}

//关闭主线程
service.shutdownNow();
log.info("in doMultiThreading end.");


主要说明:

Executors.newFixedThreadPool(number)   创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。


CountDownLatch 用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。

executorService.submit() 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的
get 方法在成功 完成时将会返回 null。

await 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。

shutdown() 调用这个方法时,ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。

shutdownNow() 试图停止所有正在执行的活动任务(待正在执行的任务停止),暂停处理正在等待的任务,并返回等待执行的任务列表。

二。 子任务代码

package com.ffcs.icity.threadpool;

import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ffcs.icity.entity.MobileBalance;
import com.ffcs.icity.service.IMobileBalanceService;

/**
* 查询话费余额子任务
* @author alan
* @createtime 2013-7-23
*
*/
public class QueryMobileBalanceRunnableTask implements Runnable {

private final static Logger log = LoggerFactory.getLogger(QueryMobileBalanceRunnableTask.class);
private List<MobileBalance> list;
private IMobileBalanceService mobileBalanceService;
private CountDownLatch countDownLatch;

public QueryMobileBalanceRunnableTask(IMobileBalanceService mobileBalanceService,List<MobileBalance> list,CountDownLatch countDownLatch) {
this.mobileBalanceService = mobileBalanceService;
this.list = list;
this.countDownLatch = countDownLatch;
}

@Override
public void run() {

log.info("start QueryMobileBalanceTask.");
if(CollectionUtils.isEmpty(list)) {
log.error("in QueryMobileBalanceTask has no data.");
return;
}

mobileBalanceService.doMobileBalance(list);
//减少外部传递的信号量
countDownLatch.countDown();
log.info("end QueryMobileBalanceTask.");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: