java多线程处理百万数据

java多线程对数据的操作,最大线程处理数,可根据实际情况进行合理设计

主要就是,多线程合理分配数据资源,不要造成多个线程争抢一个数据资源从而导致死锁就得不偿失了。本文作为参考,实际操作时,你可以将mapper注入进来,操作数据库等一系列对数据处理的方法皆可以

package com.org.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 多线程操作工具类
 */
public class ExecutorUtils {

	public static void main(String[] args) {

		// 造5000条数据(可根据实际情况造数据)
		final Integer listSize = 1000000;
		ArrayList list = new ArrayList<>();
		for (int i = 0; i < listSize; i++) {
			String user = "这是一条数据";
			list.add(user);
		}
		executeThreadPool(list);

	}

	// 一个线程最大处理数据量
	private static final int THREAD_COUNT_SIZE = 5000;

	public static void executeThreadPool(List pmsProductList) {

		long start = System.currentTimeMillis();

		// 线程数,以5000条数据为一个线程,总数据大小除以5000,再加1
		int round = pmsProductList.size() / THREAD_COUNT_SIZE + 1;
		// 程序计数器
		final CountDownLatch count = new CountDownLatch(round);
		// 创建线程
		ExecutorService executor = Executors.newFixedThreadPool(round);
		// 分配数据
		for (int i = 0; i < round; i++) {
			int startLen = i * THREAD_COUNT_SIZE;
			int endLen = ((i + 1) * THREAD_COUNT_SIZE > pmsProductList.size() ? pmsProductList.size()
					: (i + 1) * THREAD_COUNT_SIZE);
			final List threadList = pmsProductList.subList(startLen, endLen);
			int k = i + 1;
			executor.execute(new Runnable() {
				@Override
				public void run() {
					// 我这里用的是 jpa的直接添加一个list,当然这里可以把list,for循环然后调用
					// 接口添加数据库,或者进行其他数据操作
					System.out.println("正在处理线程【" + k + "】的数据,数据大小为:" + threadList.size());
					// 计数器 -1(唤醒阻塞线程)
					count.countDown();
				}
			});
		}
		try {
			// 阻塞线程(主线程等待所有子线程 一起执行业务)
			count.await();
			long end = System.currentTimeMillis();
			System.out.println("100万数据插入查询耗时:" + (end - start) + "ms");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 终止线程池
			// 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。若已经关闭,则调用没有其他作用。
			executor.shutdown();
		}
	}
}

你可能感兴趣的:(java,开发语言,线程,高并发,多线程)