Java使用Callable和Future创建线程操作示例

 更新时间:2019年09月12日 10:23:27   作者:cakincqm  
这篇文章主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下

本文实例讲述了Java使用Callable和Future创建线程操作。分享给大家供大家参考,具体如下:

一 点睛

从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大。

  • call()方法可以有返回值。
  • call()方法可以声明抛出异常。

创建并启动线程的步骤如下:

1 创建Callable接口的实现类,并实现call()方法,该call()方法将作为该线程的执行体,且该call()方法有返回值,再创建Callable的实例。从Java 8开始,可以直接使用Lamda表达式创建Callable对象。

2 使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

3 使用FutureTask对象作为Thread对象的target创建并启动新线程。

4 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

二 代码

public class ThirdThread
{
   public static void main(String[] args)
   {
      // 创建Callable对象
      ThirdThread rt = new ThirdThread();
      // 先使用Lambda表达式创建Callable<Integer>对象
      // 使用FutureTask来包装Callable对象
      FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)() -> {
        int i = 0;
        for ( ; i < 100 ; i++ )
        {
           System.out.println(Thread.currentThread().getName()
              + " 的循环变量i的值:" + i);
        }
        // call()方法可以有返回值
        return i;
      });
      for (int i = 0 ; i < 100 ; i++)
      {
        System.out.println(Thread.currentThread().getName()
           + " 的循环变量i的值:" + i);
        if (i == 20)
        {
           // 实质还是以Callable对象来创建、并启动线程
           new Thread(task , "有返回值的线程").start();
        }
      }
      try
      {
        // 获取线程返回值
        System.out.println("子线程的返回值:" + task.get());
      }
      catch (Exception ex)
      {
        ex.printStackTrace();
      }
   }
}

三 运行

main 的循环变量i的值:98
main 的循环变量i的值:99
有返回值的线程 的循环变量i的值:23
有返回值的线程 的循环变量i的值:24
有返回值的线程 的循环变量i的值:25
......
有返回值的线程 的循环变量i的值:94
有返回值的线程 的循环变量i的值:95
有返回值的线程 的循环变量i的值:96
有返回值的线程 的循环变量i的值:97
有返回值的线程 的循环变量i的值:98
有返回值的线程 的循环变量i的值:99
子线程的返回值:100

四 说明

程序先使用使用Lamda表达式创建一个Callable对象,然后将该实例包装成一个FutureTask对象。主线程中当循环变量i等于20时,程序启动以FutrueTask对象为target的线程。程序最后调用FutrueTask对象的get()方法来返回call()方法的返回值——该方法将导致主线程被阻塞,直到call()方法结束并返回为止。

更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • java正则表达式判断强密码和随机生成强密码代码示例

    java正则表达式判断强密码和随机生成强密码代码示例

    这篇文章主要给大家介绍了关于java正则表达式判断强密码和随机生成强密码的相关资料,最近需要一个密码强度正则表达式在用户注册时校验用户密码强度,需要的朋友可以参考下
    2023-08-08
  • 详解关于SpringBoot的外部化配置使用记录

    详解关于SpringBoot的外部化配置使用记录

    这篇文章主要介绍了详解关于SpringBoot的外部化配置使用记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • SpringBoot接口如何对参数进行校验

    SpringBoot接口如何对参数进行校验

    这篇文章主要介绍了SpringBoot接口如何对参数进行校验,在以SpringBoot开发Restful接口时, 对于接口的查询参数后台也是要进行校验的,同时还需要给出校验的返回信息放到上文我们统一封装的结构中
    2022-07-07
  • Java获取接口所有实现类的方式详解

    Java获取接口所有实现类的方式详解

    这篇文章主要介绍了Java获取接口所有实现类的方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • java简单工厂模式实例及讲解

    java简单工厂模式实例及讲解

    这篇文章主要为大家详细介绍了java简单工厂模式实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • SpringBoot安全认证Security的实现方法

    SpringBoot安全认证Security的实现方法

    这篇文章主要介绍了SpringBoot安全认证Security的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • SpringBoot项目中定时器的实现示例

    SpringBoot项目中定时器的实现示例

    在Spring Boot项目中,你可以使用Spring框架提供的@Scheduled注解来编写定时任务,本文就来介绍一下SpringBoot项目中定时器的实现,感兴趣的可以了解一下
    2023-11-11
  • 如何用nacos搭建微服务注册配置中心

    如何用nacos搭建微服务注册配置中心

    这篇文章主要介绍了如何用nacos搭建微服务注册配置中心问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java递归实现汉诺塔步骤介绍

    java递归实现汉诺塔步骤介绍

    大家好,本篇文章主要讲的是java递归实现汉诺塔步骤介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Java中LinkedHashSet的源码分析

    Java中LinkedHashSet的源码分析

    这篇文章主要介绍了Java中LinkedHashSet的源码分析,LinkedHashSet 是 Java 中的一个集合类,它是 HashSet 的子类,同时也实现了 Set 接口,与 HashSet 不同的是,LinkedHashSet 保留了元素插入的顺序,并且具有 HashSet 的快速查找特性,需要的朋友可以参考下
    2023-09-09

最新评论