java多线程 查询 提高效率

本文介绍了一种利用多线程加速数据处理的方法,通过将任务分配到多个线程中并行执行,显著提高了处理效率。文章详细展示了如何使用Java的CompletableFuture和ExecutorService来实现这一目标,并提供了一个具体的业务实现示例。
摘要由CSDN通过智能技术生成

工具

public <T> void accelerateThread(Consumer<List<T>> consumer,List<T> targetList,Integer threadSize) throws InstantiationException, IllegalAccessException, InterruptedException, ExecutionException {
		if (targetList == null || targetList.size() == 0) {
			return;
		}
		
		if (threadSize == null) {
			throw new RuntimeException("线程大小(threadSize)不能为空!");
		}
		
		if (threadSize > 100) {
			throw new RuntimeException("线程大小不能超过100!");
		}
		
		List<Future<?>> resultList = new ArrayList<Future<?>>();
		
		int listSize = targetList.size();
		Integer divideSize = targetList.size() / threadSize;
		
		if(divideSize.intValue() == 0) {
			divideSize = targetList.size();
			threadSize = 1;
		}
		
		CompletableFuture<Void> completableFuture = null;
		
		for (int i = 0; i < threadSize; i++) {
			List<T> list = (i == threadSize-1) ? targetList.subList(i* divideSize, listSize)
					: targetList.subList(i* divideSize, (i + 1) * divideSize);
	      	completableFuture = CompletableFuture.runAsync(()->consumer.accept(list),threadPoolTaskExecutor);
			
			resultList.add(completableFuture);
		}
		
        CompletableFuture.allOf(resultList.stream().toArray(CompletableFuture[]::new)).join();

	}
public static TaskExecutor getInstance() {
		if (taskExecutor == null) {
			taskExecutor = new TaskExecutor();
		}
		return taskExecutor;
	}

具体业务实现举例

/**
     * 制作多线程
     *      传来 models 用户集合;制作多线程分别对用户同时进行相同的操作,提高速度
     * @return
     * @throws BusinessException
     */
    public List<Model> getThreadList(List<Model> models) throws BusinessException {
        List<Model> threadList = Collections.synchronizedList(new ArrayList<>());
        Consumer<List<Model>> consumer = temps -> {
        //写业务操作
            for (Model model : temps) {
                Boolean flag = poService.isGoodModel(model.getNick());     //用户是好用户
                if (flag) {
                    threadList.add(model);
                }
            }
        };

        try {
            TaskExecutor.getInstance().accelerateThread(consumer, models, 100);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return threadList;
    }

有问题可以留言探讨一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#老程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值