方案一
备注:将数据分页,以FixedThreadPool(定长线程池)+CountDownLatch(并发流程控制)+Callable(有返回值的多线程) + Future(接收Callable的返回值)的形式进行多线程处理数据。其中CountDownLatch的工作原理:在初始化时传入子线程数量,主线程调用await()方法阻塞主线程直到CountDownLatch的技术为0,而使减计数的方法,是在子线程中传入CountDownLatch并在逻辑处理完毕后调用countDown()方法,使其计数减1,当所有线程处理完毕时,计数也将减为0,从而使阻塞的主线程继续运行。
实现方法:
public class ThreadsTest {
public void test() {
// 需要处理的数据
List<Object> dataList = new ArrayList<>();
// 每条子线程处理数据的数量
int count = 300;
// 需要处理的数据总量
int listSize = dataList.size();
// 开启的线程数
int runThreadSize = (listSize / count) + 1;
// 创建一个线程池,数量和开启线程的数量一样
ExecutorService executor = Executors.newFixedThreadPool(runThreadSize);
// 用于记录返回结果
List<Future<Object>> resultList = new ArrayList<>();
// 计数君~用于阻塞主线程,使得主线程可以等子线程全部处理完成后再返回结果
CountDownLatch countDownLatch = new CountDownLatch(runThreadSize);
for (int i = 0; i < runThreadSize; i++) {
// 本次循环子线程需要处理的数据
List<Object> newlist = null;
if ((i + 1) == runThreadSize) {
// 最后一次分组可能不满count数量,所以特殊处理
int startIndex;
startIndex = (i * count);
int endIndex = dataList.size();
newlist = dataList.subList(startIndex, endIndex);
} else {
int startIndex = (i * count);
int endIndex = (i + 1) * co