多线程分批处理数据demo

import java.util.ArrayList;
import java.util.List;

/**
 * @author jiangli
 * @date 2019/11/18 19:37
 * 结合分页查询再使用
 */
public class ThreadDemo {


	public static void main(String[] args) {
		//获取原始数据
		List<User> users = getUsers();
		//对数据拆分
		List<List<User>> lists = ListUtils.splitList(users, 2);
		//遍历拆分后的集合,进行业务处理
		for (List<User> list : lists) {
			new UserThread(list).start();
		}

	}

	private static List<User> getUsers() {
		List<User> list = new ArrayList<>();
		for (int i = 0; i < 11; i++) {
			list.add(new User(i,"java_"+i));
		}
		return list;
	}

}

class UserThread extends Thread{

	private List<User> users;

	public UserThread(List<User> users) {
		this.users = users;
	}

	@Override
	public void run() {
		for (User user : users) {
			System.out.println(Thread.currentThread().getId()+", userId: "+user.getId()+" , userName: "+user.getName());
			//执行对用户的业务方法...
		}
	}
}

大量数据分页进行处理

 @Test
    public void importDataToEs() {
        //创建索引
        elasticsearchTemplate.createIndex(Goods.class);
        //创建映射
        elasticsearchTemplate.putMapping(Goods.class);

        int page = 1;
        int rows = 100;

        do {
            //分页查询全部上架的spu
            PageResult<SpuDTO> spus = goodsApiFeign.querySpuByPage(null, true, page, rows);
            if (spus.getItems().size() == 0) {
                break;
            }
            //spu==>goods
            List<Goods> goodsList = spus.getItems().stream().map(e -> {
                Goods goods = new Goods();
                try {
                    goods = searchService.buildGoods(e);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
                return goods;
            }).collect(Collectors.toList());

            //保存到elasticsearch
            goodsRepository.saveAll(goodsList);

            page++;
            rows = spus.getItems().size();
        } while (rows == 100);


    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个 Java 多线程处理同一批数据demo: ```java import java.util.ArrayList; import java.util.List; public class MultiThreadDemo { private static final int THREAD_COUNT = 4; private static final int DATA_SIZE = 1000000; public static void main(String[] args) throws InterruptedException { // 初始化数据 List<Integer> data = new ArrayList<>(DATA_SIZE); for (int i = 0; i < DATA_SIZE; i++) { data.add(i); } // 创建线程 List<Thread> threads = new ArrayList<>(THREAD_COUNT); for (int i = 0; i < THREAD_COUNT; i++) { final int startIndex = i * DATA_SIZE / THREAD_COUNT; final int endIndex = (i + 1) * DATA_SIZE / THREAD_COUNT; Thread thread = new Thread(() -> { // 处理数据 for (int j = startIndex; j < endIndex; j++) { process(data.get(j)); } }); threads.add(thread); } // 启动线程 for (Thread thread : threads) { thread.start(); } // 等待线程执行完成 for (Thread thread : threads) { thread.join(); } // 统计结果 int result = 0; for (int i = 0; i < DATA_SIZE; i++) { result += data.get(i); } System.out.println("Result: " + result); } private static void process(int data) { // TODO: 实现数据处理的逻辑 } } ``` 在这个例子中,我们初始化了一个包含 1000000 个整数的列表,然后创建了 4 个线程来处理这些数据。每个线程处理的数据是均匀配的,即第 1 个线程处理索引为 0 到 249999 的数据,第 2 个线程处理索引为 250000 到 499999 的数据,以此类推。在每个线程中,我们调用了 `process` 方法来处理数据。 在主线程中,我们启动了所有的线程,并等待它们执行完成。然后我们统计了所有数据的和,输出了结果。 需要注意的是,在多线程处理同一批数据时,需要注意线程之间的同步问题。例如,如果 `process` 方法有副作用,可能会出现数据竞争的问题,导致结果不正确。可以使用 synchronized 或者 Lock 等机制来解决这个问题。 另外,多线程处理同一批数据的效率并不一定比单线程处理快,因为线程之间的切换和同步也会带来一定的开销。因此,在实际应用中,需要根据具体情况来选择最合适的方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值