java 多线程的使用

最近在工作中学习了一下线程池与多线程的用法记录一下

ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(Constants.threadsNum);

int size = dataList.size();

//线程处理数
int threadSize = (size % pSize)==0?size / pSize:size / pSize + 1;

CountDownLatch countDownLatch = new CountDownLatch(threadSize);
for(int i = 0; i < threadSize; i++){
    int start = i * pSize;
    int end = (i + 1) * pSize - 1 ;
    if(end > size)
        end = size-1;
    newFixedThreadPool.execute(new SaveWithdraw(dataList, iCheckWithdrawDAO,start,end,countDownLatch));
}
countDownLatch.await();
首先我们先创建一个线程池(这里我选用的是固定大小的线程池),然后合理的分配每条线程要处理的数据条数,之后我们在循环调用线程方法即可

ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(Constants.threadsNum);
ExecutorCompletionService ecs = new ExecutorCompletionService(newFixedThreadPool);
int pSize = Constants.threadsNumber;
int flag = 0;//错误记录数
int size = checkRechargeDOList.size();

//线程处理数
int threadSize = (size % pSize)==0?size / pSize:size / pSize + 1;

CountDownLatch countDownLatch = new CountDownLatch(threadSize);
for(int i = 0; i < threadSize; i++){
    int start = i * pSize;
    int end = (i + 1) * pSize - 1 ;
    if(end > size)
        end = size-1;
    ecs.submit(new CheckingCharge(checkRechargeDOList,iCheckRechargeDAO,platformAccountRechargeDAO,iIncomeDAO,start,end,countDownLatch));
}
countDownLatch.await();

for(int i = 0; i < threadSize; i++){
    //获取线程返回结果
    flag += ecs.take().get();
}

2.这是另一种用法,我们可以通过将线程池交给CompletionSrvice去管理 通过CountDownLatch.await()方法去检车线程是否执行完,如果执行完的话通过CompletionSrvice().take().get()去获取返回结果(数组)


(如果有不对的请指教,谢谢)

你可能感兴趣的:(java后台)