每天一例多线程[day19]-----JDK实现Future的用法

 

  1. import java.util.concurrent.Callable;

  2. import java.util.concurrent.ExecutorService;

  3. import java.util.concurrent.Executors;

  4. import java.util.concurrent.Future;

  5. import java.util.concurrent.FutureTask;

  6.  
  7. public class UseFuture implements Callable<String>{

  8. private String para;

  9.  
  10. public UseFuture(String para){

  11. this.para = para;

  12. }

  13.  
  14. /**

  15. * 这里是真实的业务逻辑,其执行可能很慢

  16. */

  17. @Override

  18. public String call() throws Exception {

  19. //模拟执行耗时

  20. Thread.sleep(5000);

  21. String result = this.para + "处理完成";

  22. return result;

  23. }

  24.  
  25. //主控制函数

  26. public static void main(String[] args) throws Exception {

  27. String queryStr = "query";

  28. //构造FutureTask,并且传入需要真正进行业务逻辑处理的类,该类一定是实现了Callable接口的类

  29. FutureTask<String> future = new FutureTask<String>(new UseFuture(queryStr));

  30.  
  31. FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr));

  32. //创建一个固定线程的线程池且线程数为1,

  33. ExecutorService executor = Executors.newFixedThreadPool(2);

  34. //这里提交任务future,则开启线程执行RealData的call()方法执行

  35. /**

  36. * 线程池中的submit和execute方法的区别:

  37. * 第一点是submit可以传入实现Callable接口的实例对象

  38. * 第二点是submit方法有返回值

  39. */

  40. // f1.get() 如果执行完毕则返回null

  41. Future f1 = executor.submit(future);

  42. Future f2 = executor.submit(future2);

  43. System.out.println("请求完毕");

  44.  
  45. try {

  46. //这里可以做额外的数据操作,也就是主程序执行其他业务逻辑

  47. System.out.println("处理实际的业务逻辑...");

  48. Thread.sleep(1000);

  49. } catch (Exception e) {

  50. e.printStackTrace();

  51. }

  52. /**

  53. * future.get方法异步等待获取线程池的处理的最终结果

  54. * 如果call()方法没有执行完成,则依然会进行等待

  55. *

  56. */

  57. System.out.println("数据:" + future.get());

  58. System.out.println("数据:" + future2.get());

  59. executor.shutdown();

  60. }

  61.  
  62. }

打印:

 
  1. 请求完毕

  2. 处理实际的业务逻辑...

  3. 数据:query处理完成

  4. 数据:query处理完成

分析:我们在主函数中定义两个FutureTask,并分别传入实现了Callable接口的对象,定义一个固定数量线程池,将FutureTask对象submit进线程池,每个JDK实现的线程池都有execute和submit两个方法,这两个方法的区别:

1 submit可以传入实现Callable接口的实例对象

2 submit方法有Future类型返回值(这个返回的Future对象有个get方法,可以返回线程池中提交的对应任务是否执行完毕,是则返回null)

我们可以通过定义的FutureTask实例对象的get方法去异步获取线程池中Callable对象的处理结果,如果call()没有执行完毕,则会继续等待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值