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