[[IT知识]] 掌握Java线程:Callable与Future机制详解

[复制链接]
查看: 25|回复: 0
发表于 16 小时前 | 显示全部楼层 | 阅读模式
易博V9下载

掌握Java线程:Callable与Future机制详解

常见的两种创建线程的方式。一种是直接继承Thread,另外一种就是实现Runnable接口。

这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。

从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。

Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。(因为可以异步获得执行结果,所以不用一直同步等待去获得执行结果)。


掌握Java线程:Callable与Future机制详解

这里给一个实际使用的案例代码,理论是一样的,但是编码方式有多种。

关于代码的注意点和说明,都在注释里面,由于案例比较简单,这里不再啰嗦。

  1. package com.example.springboot;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.example.springboot.entity.User;
  4. import com.example.springboot.mapper.UserMapper;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context@SpringBootTest;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.concurrent.*;
  11. import java.util.function.Supplier;
  12. // Future 机制测试
  13. @SpringBootTest
  14. public class FutureTest {
  15. @Autowired
  16. private UserMapper userMapper;
  17. private static ThreadPoolExecutor pool;
  18. static {
  19. pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
  20. }
  21. @Test
  22. public void test1() throws Exception {
  23. // 创建一个调用次数为2的计数工具
  24. CountDownLatch countDownLatch = new CountDownLatch(2);
  25. // 直接在异步内组装返回数据,注意List不是线程安全的,也可以采用Vector或者synchronized关键字方式
  26. List<User> listTmp = new CopyOnWriteArrayList<>();
  27. // 通过异步返回接收,因为是编码依次接收,所以不存在安全问题
  28. List<User> listRe = new ArrayList<>();
  29. // 异步执行 1
  30. CompletableFuture<User> reStrFu1 = CompletableFuture.supplyAsync(new Supplier<User>() {
  31. @Override
  32. public User get() {
  33. try {
  34. Thread.sleep(2000);
  35. // 获取结果方式1,直接组装到上层方法变量中
  36. User user = userMapper.selectById(1);
  37. listTmp.add(user);
  38. return user;
  39. }catch (Exception e){
  40. e.printStackTrace();
  41. }finally {
  42. countDownLatch.countDown(); // 异步执行结束
  43. }
  44. return null;
  45. }
  46. }, pool);
  47. // 异步执行 2
  48. CompletableFuture<User> reStrFu2 = CompletableFuture.supplyAsync(new Supplier<User>() {
  49. @Override
  50. public User get() {
  51. try {
  52. Thread.sleep(2000);
  53. // 获取结果方式1,直接组装到上层方法变量中
  54. User user = userMapper.selectById(2);
  55. listTmp.add(user);
  56. return user;
  57. }catch (Exception e){
  58. e.printStackTrace();
  59. }finally {
  60. countDownLatch.countDown(); // 异步执行结束
  61. }
  62. return null;
  63. }
  64. }, pool);
  65. // 获取结果方式3,等待计数结束
  66. try {
  67. countDownLatch.await();
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. }
  71. listRe.add(reStrFu1.get());
  72. listRe.add(reStrFu2.get());
  73. System.out.println(listTmp + JSON.toJSONString(listTmp));
  74. System.out.println(listRe + JSON.toJSONString(listRe));
  75. }
  76. }
复制代码

最后打印结果是一样的,都是两条数据的JSON。

END

易博软件介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|Archiver|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表