详解JDK中ExecutorService与Callable和Future对线程的支持

 更新时间:2017年09月22日 10:13:08   作者:莫欺少年穷Java  
这篇文章主要介绍了详解JDK中ExecutorService与Callable和Future对线程的支持的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

详解JDK中ExecutorService与Callable和Future对线程的支持

1、代码背景:

    假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?

2、代码:

    统计“盘子”大小的代码,此处实现jdk中的Callable接口,

package com.wang.test.concurrent; 
 
import java.util.concurrent.Callable; 
 
public class Task1 implements Callable<Integer> { 
 
  private int x; 
  private int y; 
   
  public Task1(int x, int y) { 
    this.x = x; 
    this.y = y; 
  } 
 
  @Override 
  public Integer call() throws Exception { 
    return x*y; 
  } 
 
} 

    统计汇总的代码,也是实现jdk中的Callable接口,

package com.wang.test.concurrent; 
 
import java.util.concurrent.Callable; 
 
public class Task2 implements Callable<Integer> { 
 
  private int x; 
  private int y; 
  private int q; 
  private int w; 
   
  public Task2(int x, int y, int q, int w) { 
    this.x = x; 
    this.y = y; 
    this.q = q; 
    this.w = w; 
  } 
 
  @Override 
  public Integer call() throws Exception { 
    return x + y + q + w; 
  } 
 
} 

     客户端:使用JDK中Executors.newFixedThreadPool方法创建ExecutorService,ExecutorService的submit方法接收Callable接口的实现,JDK内部将弄成线程处理,使用Future接收submit方法的返回值,当future调用get方法时,如果线程还没有执行完,程序阻塞在这里,知道线程执行完。

package com.wang.test.concurrent; 
 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 
 
public class Client { 
 
  public static void main(String[] args) throws Exception { 
    ExecutorService pool = Executors.newFixedThreadPool(4); 
 
    Task1 t1 = new Task1(1,2); 
    Task1 t2 = new Task1(23,34); 
    Task1 t3 = new Task1(23,456); 
    Task1 t4 = new Task1(3,33); 
    Future<Integer> f1 = pool.submit(t1); 
    Future<Integer> f2 = pool.submit(t2); 
    Future<Integer> f3 = pool.submit(t3); 
    Future<Integer> f4 = pool.submit(t4); 
     
    //Future调用get方法时,如果线程还没有执行完,程序阻塞在这里 
    Task2 t5 = new Task2(f1.get(), f2.get(), f3.get(), f4.get()); 
    Future<Integer> f5 = pool.submit(t5); 
     
    System.out.println(f5.get()); 
     
    pool.shutdown(); 
  } 
} 

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • spring WebSocket示例详解

    spring WebSocket示例详解

    websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,本篇文章主要介绍了spring WebSocket示例详解 ,有兴趣的可以了解一下。
    2017-01-01
  • JAVA实现Excel和PDF上下标的操作代码

    JAVA实现Excel和PDF上下标的操作代码

    这篇文章主要介绍了JAVA实现Excel和PDF上下标,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 聊聊RabbitMQ发布确认高级问题

    聊聊RabbitMQ发布确认高级问题

    这篇文章主要介绍了RabbitMQ发布确认高级问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 解决Java中的强制类型转换和二进制表示问题

    解决Java中的强制类型转换和二进制表示问题

    这篇文章主要介绍了解决Java中的强制类型转换和二进制表示问题,需要的朋友可以参考下
    2019-05-05
  • MyBatisPlus+SpringBoot实现乐观锁功能详细流程

    MyBatisPlus+SpringBoot实现乐观锁功能详细流程

    乐观锁是针对一些特定问题的解决方案,主要解决丢失更新问题,下面这篇文章主要给大家介绍了关于MyBatisPlus+SpringBoot实现乐观锁功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Java8中对于LocalDateTime的序列化和反序列化问题

    Java8中对于LocalDateTime的序列化和反序列化问题

    这篇文章主要介绍了Java8中对于LocalDateTime的序列化和反序列化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java中HashSet和LinkedHashSet详解

    Java中HashSet和LinkedHashSet详解

    这篇文章主要介绍了Java中HashSet和LinkedHashSet详解,   HashSet是Set接口的子类,其内部采用了HashMap作为数据存储,HashSet其实就是在操作HashMap的key,HashSet是无序存储的,不能保证元素的顺序;HashSet并没有进行同步处理,因此是线程不安全的,需要的朋友可以参考下
    2023-09-09
  • 浅谈Spring 重定向指南

    浅谈Spring 重定向指南

    本篇文章主要介绍了浅谈Spring 重定向指南,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Spring Boot 集成接口管理工具 Knife4j

    Spring Boot 集成接口管理工具 Knife4j

    这篇文章主要介绍了Spring Boot 集成接口管理工具 Knife4j,首先通过创建一个 Spring Boot 项目展开主题,需要的小伙伴可以参考一下
    2022-05-05
  • Java ASM使用logback日志级别动态切换方案展示

    Java ASM使用logback日志级别动态切换方案展示

    这篇文章主要介绍了Java ASM使用logback日志级别动态切换方案展示,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04

最新评论