一。 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.");
}
}