Java工具:多線程批量分隔執行任務

//調用工具主類

package com.zycfc.mpc.process.util;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.springframework.transaction.TransactionStatus;
public class Execute {
	public  static void batchDeal(List<?> data, int batchNum) throws Exception {
        int totalNum = data.size();
        int pageNum = totalNum % batchNum == 0 ? totalNum / batchNum : totalNum / batchNum + 1;
        ExecutorService executor = Executors.newFixedThreadPool(pageNum);
        TransactionStatus transactionStatus=null;
        try {
            CountDownLatch countDownLatch = new CountDownLatch(pageNum);
            List subData = null;
            int fromIndex, toIndex;
            for (int i = 0; i < pageNum; i++) {
                fromIndex = i * batchNum;
                toIndex = Math.min(totalNum, fromIndex + batchNum);
                subData = data.subList(fromIndex, toIndex);
                ImportTask task = new ImportTask(fromIndex,toIndex-1,subData, countDownLatch);
                executor.execute(task);
            }                 
            // 主線程必須在啓動其它線程後立即調用CountDownLatch.await()方法,
            // 這樣主線程的操作就會在這個方法上阻塞,直到其它線程完成各自的任務。
            // 計數器的值等於0時,主線程就能通過await()方法恢復執行自己的任務。
            countDownLatch.await();         
            System.out.println("執行完畢");
            //logger.info("數據操作完成!可以在此開始其它業務");
        }finally {
            // 關閉線程池,釋放資源
            executor.shutdown();
        }
    }
}

//具體的線程業務執行,根據自己的需要剔除一些代碼哈 

package com.zycfc.mpc.process.util;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import org.assertj.core.util.Lists;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import com.zycfc.mpc.core.orm.smschan.domain.TMpcSmsChan;
import com.zycfc.mpc.core.orm.smschan.service.TMpcSmsChanService;
import com.zycfc.mpc.process.MpcPo;
import com.zycfc.zsf.boot.core.common.SpringContextHelper;
import com.zycfc.zsf.boot.id.IdGenerator;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ImportTask implements Runnable {
	private List<MpcPo> list;
	private CountDownLatch countDownLatch;
	public int fromIndex;
	public int toIndex;
	public ImportTask(int fromIndex, int toIndex, List<MpcPo> list, CountDownLatch countDownLatch) {
		this.list = list;
		this.countDownLatch = countDownLatch;
		this.fromIndex = fromIndex;
		this.toIndex = toIndex;
	}
	public TransactionStatus transactionStatus;
	public DataSourceTransactionManager dataSourceTransactionManager;
	@Override
	public void run() {
		try {
			dataSourceTransactionManager = SpringContextHelper.getBean(DataSourceTransactionManager.class);
			TransactionDefinition transactionDefinition = SpringContextHelper.getBean(TransactionDefinition.class);
			transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
			TMpcSmsChanService tMpcSmsChanService = (TMpcSmsChanService) SpringContextHelper
					.getBean("TMpcSmsChanService");
			IdGenerator  idGenerator =(IdGenerator )SpringContextHelper
					.getBean("idGenerator");
			List<TMpcSmsChan> listChan = Lists.newArrayList();
			for (MpcPo mpcPo : list) {
				// 先更新
				String smsNo = mpcPo.getSmsNo();
				Set<String> split = dealRepeat(mpcPo.getChanNo());
				for (String string : split) {
					TMpcSmsChan chan = new TMpcSmsChan();
					chan.setSmsNo(mpcPo.getSmsNo());
					chan.setChanNo(string);
					chan.setCreateUser("xhxadmin");
					String generate = SerialNum.getMoveOrderNo();
					System.out.println("生成"+generate);
					chan.setId(generate);
					listChan.add(chan);
				}
			}
			tMpcSmsChanService.addBatch(listChan);
			dataSourceTransactionManager.commit(transactionStatus);// 提交
			System.out.println(fromIndex+"插入成功"+toIndex);
		} catch (Exception e) {
			if (transactionStatus != null) {
				dataSourceTransactionManager.rollback(transactionStatus);
			}
			e.printStackTrace();
			System.out.println(fromIndex+"插入失敗"+toIndex);
		}
		// 發出線程任務完成的信號
		countDownLatch.countDown();
	}
	public static Set<String> dealRepeat(String str) {
		String[] split = str.split(",");
		Map<String,String> map=new HashMap<String,String>();
		for (String string : split) {
			map.put(string, string);
		}
		Set<String> keySet = map.keySet();
		return keySet;
	}
}

SpringContextHelper類

package com.java.batch;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextHelper implements ApplicationContextAware {
	private static ApplicationContext applicationContext;

	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		SpringContextHelper.applicationContext = applicationContext;
	}

	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}
	public static Object getBean(String name) {
		return getApplicationContext().getBean(name);
	}

	public static <T> T getBean(Class<T> clazz) {
		return getApplicationContext().getBean(clazz);
	}

	public static <T> T getBean(String name, Class<T> clazz) {
		return getApplicationContext().getBean(name, clazz);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章