当前位置: 首页 > wzjs >正文

网站建设架百度怎样发布信息

网站建设架,百度怎样发布信息,可克达拉市建设局网站,幼教机构网站开发设计论文CompletableFuture 是 Java 8 引入的一个用于异步编程的类&#xff0c;它是 Future 接口的增强版本。以下是主要特点和常用方法&#xff1a; 基础创建&#xff1a; // 创建一个完成的 Future CompletableFuture<String> cf1 CompletableFuture.completedFuture("…

CompletableFuture 是 Java 8 引入的一个用于异步编程的类,它是 Future 接口的增强版本。以下是主要特点和常用方法:

  1. 基础创建
// 创建一个完成的 Future
CompletableFuture<String> cf1 = CompletableFuture.completedFuture("Hello");// 创建一个异步执行的 Future
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> {return "Hello Async";
});
  1. 转换和链式操作
CompletableFuture.supplyAsync(() -> "Hello").thenApply(s -> s + " World")     // 转换值.thenAccept(System.out::println)   // 消费值.thenRun(() -> System.out.println("Done")); // 执行操作
  1. 组合多个 Future
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> "World");// 组合两个 Future
cf1.thenCombine(cf2, (result1, result2) -> result1 + " " + result2).thenAccept(System.out::println);
  1. 异常处理
CompletableFuture.supplyAsync(() -> {throw new RuntimeException("出错了");
})
.exceptionally(throwable -> {System.out.println("发生错误:" + throwable.getMessage());return "默认值";
})
.thenAccept(System.out::println);
  1. 实际应用示例
public class Service {public CompletableFuture<String> getDataAsync() {return CompletableFuture.supplyAsync(() -> {// 模拟耗时操作try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}return "数据";});}public void process() {getDataAsync().thenApply(data -> data + "处理").thenAccept(result -> System.out.println("结果: " + result)).exceptionally(ex -> {System.err.println("处理失败: " + ex.getMessage());return null;});}
}

主要方法说明:

  1. supplyAsync(): 异步执行有返回值的任务
  2. runAsync(): 异步执行无返回值的任务
  3. thenApply(): 转换值(类似 map)
  4. thenAccept(): 消费值(无返回值)
  5. thenCombine(): 组合两个 Future
  6. allOf(): 等待多个 Future 全部完成
  7. anyOf(): 等待多个 Future 中的任意一个完成

使用建议:

  1. 优先使用 thenCompose() 而不是 thenApply() 来组合返回 CompletableFuture 的方法
  2. 记得处理异常,可以使用 exceptionally()handle()
  3. 如果需要自定义线程池,可以在创建时指定:CompletableFuture.supplyAsync(supplier, executor)

这些是 CompletableFuture 的基础用法,它能大大简化异步编程的复杂度。需要注意的是,CompletableFuture 默认使用 ForkJoinPool.commonPool(),在生产环境中可能需要考虑使用自定义的线程池。


项目场景

批量修改信息
1)请求类,接受图片 id 列表等字段:

 @Data
public class PictureEditByBatchRequest implements Serializable {/*** 图片 id 列表*/private List<Long> pictureIdList;/*** 空间 id*/private Long spaceId;/*** 分类*/private String category;/*** 标签*/private List<String> tags;private static final long serialVersionUID = 1L;
}

2)开发批量修改图片服务,依次完成参数校验、空间权限校验、图片查询、批量更新操作:

 @Override
@Transactional(rollbackFor = Exception.class)
public void editPictureByBatch(PictureEditByBatchRequest pictureEditByBatchRequest, User loginUser) {List<Long> pictureIdList = pictureEditByBatchRequest.getPictureIdList();Long spaceId = pictureEditByBatchRequest.getSpaceId();String category = pictureEditByBatchRequest.getCategory();List<String> tags = pictureEditByBatchRequest.getTags();// 1. 校验参数ThrowUtils.throwIf(spaceId == null || CollUtil.isEmpty(pictureIdList), ErrorCode.PARAMS_ERROR);ThrowUtils.throwIf(loginUser == null, ErrorCode.NO_AUTH_ERROR);// 2. 校验空间权限Space space = spaceService.getById(spaceId);ThrowUtils.throwIf(space == null, ErrorCode.NOT_FOUND_ERROR, "空间不存在");if (!loginUser.getId().equals(space.getUserId())) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR, "没有空间访问权限");}// 3. 查询指定图片,仅选择需要的字段List<Picture> pictureList = this.lambdaQuery().select(Picture::getId, Picture::getSpaceId).eq(Picture::getSpaceId, spaceId).in(Picture::getId, pictureIdList).list();if (pictureList.isEmpty()) {return;}// 4. 更新分类和标签pictureList.forEach(picture -> {if (StrUtil.isNotBlank(category)) {picture.setCategory(category);}if (CollUtil.isNotEmpty(tags)) {picture.setTags(JSONUtil.toJsonStr(tags));}});// 5. 批量更新boolean result = this.updateBatchById(pictureList);ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
}

上述是调用mybatis plusupdateBatchById 批量更新的操作。如果要处理大量数据,可以使用线程池 + 分批 + 并发进行优化,参考代码如下:

 @Resource
private ThreadPoolExecutor customExecutor;/*** 批量编辑图片分类和标签*/
@Override
@Transactional(rollbackFor = Exception.class)
public void batchEditPictureMetadata(PictureBatchEditRequest request, Long spaceId, Long loginUserId) {// 参数校验validateBatchEditRequest(request, spaceId, loginUserId);// 查询空间下的图片List<Picture> pictureList = this.lambdaQuery().eq(Picture::getSpaceId, spaceId).in(Picture::getId, request.getPictureIds()).list();if (pictureList.isEmpty()) {throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "指定的图片不存在或不属于该空间");}// 分批处理避免长事务int batchSize = 100;List<CompletableFuture<Void>> futures = new ArrayList<>();for (int i = 0; i < pictureList.size(); i += batchSize) {List<Picture> batch = pictureList.subList(i, Math.min(i + batchSize, pictureList.size()));// 异步处理每批数据CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {batch.forEach(picture -> {// 编辑分类和标签if (request.getCategory() != null) {picture.setCategory(request.getCategory());}if (request.getTags() != null) {picture.setTags(String.join(",", request.getTags()));}});boolean result = this.updateBatchById(batch);if (!result) {throw new BusinessException(ErrorCode.OPERATION_ERROR, "批量更新图片失败");}}, customExecutor);futures.add(future);}// 等待所有任务完成CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
}

示例图如下

在这里插入图片描述

http://www.dtcms.com/wzjs/289881.html

相关文章:

  • 柳市做网站的公司自己怎么做游戏推广赚钱
  • 娄底哪里做网站河南网站seo靠谱
  • 网站备案更改需要多久100个成功营销案例
  • 模仿图库网站开发网络广告案例
  • 网站建设寻找可以途径济南疫情最新情况
  • b2b2c网站建设seo网站推广全程实例
  • 网站建设基本常识获客渠道有哪些
  • 群晖做网站服务器 套件湖南专业关键词优化
  • 做网站的公司推荐长春百度快速优化
  • 深圳东门疫情淘宝关键词优化技巧教程
  • 成都关键词百度起诉seo公司
  • 艺考有哪些专业百度关键词优化多少钱一年
  • 提供网站建设运营公司资质网络营销推广渠道有哪些
  • 房地产网站怎么做培训心得体会500字
  • 网站怎么做qq授权登录环球军事网
  • 与网站开发有关的岗位是哪些优化神马网站关键词排名价格
  • 举报网站建设公司网络营销的主要内容包括
  • 如何做优化网站排alexa优化百度软件应用中心下载
  • 网站建设需要哪些基础友情链接翻译
  • 上海微信网站公司如何做网站关键词优化
  • 咸宁市做网站在线生成网站
  • php做网站怎么样如何做推广呢
  • 福州网站建设外包dw软件怎么制作网页
  • 学生做网站怎么收费百度搜索历史记录
  • 如何做高端网站建设哈尔滨最新信息
  • 北京东站深圳靠谱网站建设公司
  • 昆明平台网站开发站长素材网
  • 政府网站建设招标文件百度百科词条
  • 建设六马路小学 网站优化大师人工服务电话
  • 企业网站seo贵不贵seo做关键词怎么收费的