文章目录

  • 7 Callable接口
    • 7.1 Callable接口创建线程
    • 7.2 FutureTask

7 Callable接口

创建线程的多种方式:

  1. 继承Thread类
  2. 实现Runnable接口
  3. Callable接口
  4. 线程池

7.1 Callable接口创建线程

目前学习了有两种创建线程的方法,一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程,但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供了 Callable 接口

比较Runnable接口和Callable接口

  1. Callable中的call()计算结果,如果无法计算结果,会抛出异常

    1. Runnable中的run()使用实现接口Runnable的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用该对象的run方法

总的来说:run()没有返回值,不会抛出异常。而call()有返回值,会抛出异常

因为Thread的构造函数中没有Callable接口的参数设置,直接替换不可以,只能用下面这种线程创建方法(找一个类,即和Runnable接口有关系,又和Callable接口有关系)

发现Runnable接口有实现类FutureTask(中间对象)

FutureTask的构造函数有Callable参数,通过FutureTask创建线程对象

使用 lambda 方式创建代码如下:

public class CallableTest {public static void main(String[] args) throws ExecutionException, InterruptedException {new Thread(()->{System.out.println(Thread.currentThread().getName()+"执行Runnable");}).start();FutureTask<String> task = new FutureTask<>(() -> {System.out.println(Thread.currentThread().getName() + "使用Callable接口");return "Callable接口返回值";});new Thread(task).start();System.out.println("Callable返回值:" + task.get());}
}

输出为:

Thread-0执行Runnable
Thread-1使用Callable接口
Callable返回值:Callable接口返回值

详细代码可以参考如下代码

//比较 callable和runnable 的区别
class MyThread1 implements Runnable{@Overridepublic void run() {//这里没有返回值}
}
class MyThread2 implements Callable{@Overridepublic Object call() throws Exception {System.out.println(Thread.currentThread().getName()+"线程运行");return "Callable 的实现线程";  //有返回值}
}public class diffentence {public static void main(String[] args) throws ExecutionException, InterruptedException {//创建 实现Runnable 的线程new Thread( new MyThread1(),"t1" ).start();//创建 实现Callable 的线程 不能直接替换 ,没有这个类型的构造方法// new Thread( new MyThread2(),"t2" ).start();//选择FutureTask 他是 Runnable 的实现类,而且构造方法含有Callable类型FutureTask<String>  task = new FutureTask(new MyThread2());new Thread(task,"hhh").start();System.out.println("返回值"+task.get()); //调用里面的返回值}
}

7.2 FutureTask

进入FutureTask底层源码可以看到它的构造器

// 创建一个FutureTask,一旦运行就执行给定的Callable
public FutureTask(Callable<V> callable) {if (callable == null)throw new NullPointerException();this.callable = callable;this.state = NEW;       // ensure visibility of callable
}
// 创建一个FutureTask,一旦运行就执行给定的Ru你那边了,并安排成功完成时get返回给定的结果
public FutureTask(Runnable runnable, V result) {this.callable = Executors.callable(runnable, result);this.state = NEW;       // ensure visibility of callable
}

其他常用的代码:

// get()获取结果
public V get() throws InterruptedException, ExecutionException {int s = state;if (s <= COMPLETING)s = awaitDone(false, 0L);return report(s);
}
// outcome就是返回值
private V report(int s) throws ExecutionException {Object x = outcome;if (s == NORMAL)return (V)x;if (s >= CANCELLED)throw new CancellationException();throw new ExecutionException((Throwable)x);
}

未来的任务,如果运行过一次,那么下一次,就直接得到结果

【JUC并发编程07】Callable接口相关推荐

  1. JUC并发编程之Callable接口、JUC三大辅助类

    目录 8. Callable接口 8.1 创建线程的多种方式 8.2 概述 8.3 用Callable接口创建Thred线程 8.4 小结(重点) 9. JUC 三大辅助类 9.1 概述 9.2 减少 ...

  2. [Java并发编程-6] Callable接口

    文章目录 如何使用 理解FutrueTask 举个栗子 Callable接口和Runnale接口一样, 也能 创建新线程 Runnable接口和Callable接口的不同: 是否有返回值 是否抛出异常 ...

  3. 【尚硅谷】大厂必备技术之JUC并发编程——笔记总结

    [JUC并发编程01]JUC概述 关键字:进程和线程.进程和线程.wait和sleep.并发与并行.管程.用户线程和守护线程 [JUC并发编程02]Lock接口 关键字:synchronized.Lo ...

  4. ❤️《JUC并发编程从入门到高级》(建议收藏)❤️

    JUC并发编程 1.什么是JUC JUC的意思就是java并发编程工具包,与JUC相关的有三个包:java.util.concurrent.java.util.concurrent.atomic.ja ...

  5. 多线程进阶=》JUC并发编程02

    在JUC并发编程01中说到了,什么是JUC.线程和进程.Lock锁.生产者和消费者问题.8锁现象.集合类不安全.Callable(简单).常用辅助类.读写锁 https://blog.csdn.net ...

  6. 基于《狂神说Java》JUC并发编程--学习笔记

    前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...

  7. Java JUC并发编程详解

    Java JUC并发编程详解 1. JUC概述 1.1 JUC简介 1.2 进程与线程 1.2 并发与并行 1.3 用户线程和守护线程 2. Lock接口 2.1 Synchronized 2.2 什 ...

  8. 多线程进阶=》JUC并发编程

    多线程进阶=>JUC并发编程 1.什么是JUC ​ JUC是java.util.concurrent的简写. ​ 用中文概括一下,JUC的意思就是java并发编程工具包. ​ 并发编程的本质就是 ...

  9. JUC并发编程(java util concurrent)(哔站 狂神说java juc并发编程 摘录笔记)

    JUC并发编程(java util concurrent) 1.什么是JUC JUC并不是一个很神秘的东西(就是 java.util 工具包.包.分类) 业务:普通的线程代码 Thread Runna ...

最新文章

  1. Android移动开发之【Android实战项目】记一次app开发过程!
  2. Python基础之条件判断
  3. AI:人工智能的多模态融合模型的简介、发展以及未来趋势
  4. QEventLoop的简单使用(二)
  5. 较流行的4个开源协议
  6. python引入pytesseract报错:ValueError: Attempted relative import in non-package
  7. Packet Tracer 思科模拟器入门教程
  8. Linux笔记(十二) Linux集群搭建(附带视频详解)
  9. 微型计算机系统评课,微机课评课稿.doc
  10. 计算机网络技术 虚拟仿真教学实验,虚拟仿真实验教学优秀课件
  11. Win10 LTSC 2021长期服务企业版
  12. python selenium 点击加载更多_Python Selenium 疑难杂症解方(三): 点击
  13. python任务栏都隐藏了_如何隐藏PyQt4 Python应用程序的任务栏图标?
  14. N个鸡蛋放到M个篮子中
  15. 一个SAP开发人员的2017总结:编程与游泳
  16. Intel® 2019网络技术研讨会圆满落幕
  17. 安装Linux Mint 17后要做的20件事
  18. Linux下安装realtek8812au /8814au 驱动
  19. 人工智能导论--浙江工业大学--王万良
  20. 国家计算机职业技能鉴定4级考试内容大全

热门文章

  1. python 函数性能分析
  2. JS模块化写法(转)
  3. JavaScript 读取、写入Txt文档
  4. C++ Primer 5th笔记(chap 17 标准库特殊设施)IO库 之操纵符
  5. 区块链BaaS云服务(35)亦笔科技ODRChain
  6. 《研磨设计模式》chap13 命令模式
  7. java元婴期(20)----java进阶(spring(4)---spring aop编程(全自动)AspectJ)
  8. 【django】项目准备
  9. DRF_APIView之认证、授权配置
  10. Intel 平台编程总结----缓存的优化