一.线程池工具类
/**
* 线程池工具类
* @author ljc
* @version 1.0
* @date 2019/6/10/0010 - 09:47
*/
public class ThreadPoolUtils {
/**
* 核心线程数,会一直存活,即使没有任务,线程池也会维护线程的最少数量
*/
private static final int SIZE_CORE_POOL = 5;
/**
* 线程池维护线程的最大数量
*/
private static final int SIZE_MAX_POOL = 10;
/**
* 线程池维护线程所允许的空闲时间
*/
private static final long ALIVE_TIME = 2000;
/**
* 线程缓冲队列,当core线程被线程任务占满时,若此时有新的线程任务进来,那么新的线程任务会被排进BlockingQueue<Runnable>队列中
*/
private static BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(100);
private static ThreadPoolExecutor pool = new ThreadPoolExecutor(SIZE_CORE_POOL, SIZE_MAX_POOL, ALIVE_TIME, TimeUnit.MILLISECONDS, bqueue, new ThreadPoolExecutor.CallerRunsPolicy());
private ThreadPoolUtils(){}
static {
pool.prestartAllCoreThreads();
}
public static ThreadPoolExecutor getPool() {
return pool;
}
}
二.多线程的使用及开启编程式事务
ThreadPoolUtils.getPool().submit(new Runnable() {
@Override
public void run() {
//开启编程式事务
transactionTemplate.execute(new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus transactionStatus) {
try {
---代码逻辑----
return true;
}
catch (Exception e) {
//事务回滚;
transactionStatus.setRollbackOnly();
e.printStackTrace();
return false;
}
}
});
}
});
}
注:
@Transactional在多线程中不支持,故开启编程式事务
如果代码逻辑中不涉及事务控制可以去除编程式事务