开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
java-labrary
/
thread
/
src
/
test
/
java
/
FutureLesson2.java
java-labrary
/
thread
/
src
/
test
/
java
/
FutureLesson2.java
FutureLesson2.java 6.50 KB
一键复制 编辑 原始数据 按行查看 历史
xujunqiang 提交于 2022年05月05日 10:55 +08:00 . fix: future
import com.tplhk.thread.completeableFuture.service.*;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
* @ClassName : FutureLesson1
* @Description : 一个例子走进CompletableFuture
* @Author : jqxu
* @Date: 2022年4月27日 9:11
**/
@Slf4j
@SpringBootTest(classes = {FutureLesson2.class})
public class FutureLesson2 {
/**
* allof 的使用
*
* @throws InterruptedException
* @throws TimeoutException
* @throws ExecutionException
*/
@Test
public void allof() throws InterruptedException, TimeoutException, ExecutionException {
long start = System.currentTimeMillis();
// 结果集
List<String> list = new ArrayList<>();
ExecutorService executorService = Executors.newFixedThreadPool(10);
List<Integer> taskList = Arrays.asList(2, 1, 3, 4, 5);
// 全流式处理转换成CompletableFuture[]+组装成一个无返回值CompletableFuture,join等待执行完毕。返回结果whenComplete获取
CompletableFuture[] cfs = taskList.stream()
.map(integer -> CompletableFuture.supplyAsync(() -> {
log.info("{},{}", integer, Thread.currentThread().getName());
return calc(integer);
}, executorService)
.thenApplyAsync(h -> {
log.info(":::{},{}", h, Thread.currentThread().getName());
if (new Random().nextInt(10) % 2 == 0) {
log.info("{}抛了个运算异常", h);
int i = 12 / 0;
}
return Integer.toString(h);
})
.handle((s, e) -> {
if (null != e) {
System.out.println("异常了!!!!" + LocalDateTime.now());
return null;
}
System.out.println("任务" + s + "完成!result=" + s + LocalDateTime.now());
// list 也可以保存结果
list.add(s);
// 结果保存到 future 中
return s;
})
).toArray(CompletableFuture[]::new);
//阻塞等待所有任务完成. 使用 get ,调用方处理异常,就不会导致调用方线程永久阻塞
CompletableFuture.allOf(cfs).get();
List<String> collect = Arrays.stream(cfs).filter(item -> null != item.join()).map(item -> item.join().toString()).collect(Collectors.toList());
System.out.println(LocalDateTime.now() + ",collect=" + collect + ",耗时=" + (System.currentTimeMillis() - start));
System.out.println(LocalDateTime.now() + ", list=" + list + ",耗时=" + (System.currentTimeMillis() - start));
}
public int calc(Integer i) {
try {
if (i == 1) {
Thread.sleep(5000);//任务1耗时3秒
} else if (i == 5) {
Thread.sleep(5000);//任务5耗时5秒
} else {
Thread.sleep(5000);//其它任务耗时1秒
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return i;
}
/**
* complex 的使用
* 1. 在线程中取得cars列表
* 2. 遍历cars ,每个car 在独立线程中调用 rating(carName) 得到一个评分
* 3. 所有 cars 评分得到后,打印car信息和评分
*
* @throws InterruptedException
* @throws TimeoutException
* @throws ExecutionException
*/
@Test
public void complex() throws InterruptedException, TimeoutException, ExecutionException {
long start = System.currentTimeMillis();
ExecutorService taskExecutor = Executors.newFixedThreadPool(10);
log.info("{} ", Thread.currentThread().getName());
CompletableFuture.supplyAsync(() -> getCarInfo(), taskExecutor).thenCompose((v) -> {
log.info("{} ", Thread.currentThread().getName());
List<CompletableFuture<CarInfo>> completableFutureList = v.stream().map(car -> rating(car.getCarName(), car.getId())
.thenApply((score) -> {
car.setScore(score);
return car;
})).collect(Collectors.toList());
return CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()]))
.thenApply(all -> completableFutureList.stream()
.map(item -> item.handle((carinfo, e) -> {
if (null != e) {
log.info("{} error!!!", carinfo.getCarName());
return null;
}
return carinfo;
}))
.map(item -> item.join())
.filter(Objects::nonNull).collect(Collectors.toList()));
}).whenComplete((list, e) -> {
list.stream().forEach(item -> {
log.info(item.toString());
});
});
Thread.sleep(30 * 1000);
}
public List<CarInfo> getCarInfo() {
log.info("{} ", Thread.currentThread().getName());
List<CarInfo> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
CarInfo carInfo = new CarInfo();
carInfo.setId(i);
carInfo.setCarName("car" + i);
list.add(carInfo);
}
return list;
}
private CompletableFuture<Integer> rating(String carName, int i) {
log.info("{},{} ", i, Thread.currentThread().getName());
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(i * 5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Random().nextInt(100);
});
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

学习demo
取消

发行版

暂无发行版

贡献者

全部

语言

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/minimoto/java-labrary.git
git@gitee.com:minimoto/java-labrary.git
minimoto
java-labrary
java-labrary
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /