【JUC并发编程07】Callable接口
文章目录
- 7 Callable接口
- 7.1 Callable接口创建线程
- 7.2 FutureTask
7 Callable接口
创建线程的多种方式:
- 继承Thread类
- 实现Runnable接口
- Callable接口
- 线程池
7.1 Callable接口创建线程
目前学习了有两种创建线程的方法,一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程,但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供了 Callable 接口
比较Runnable接口和Callable接口
Callable中的call()计算结果,如果无法计算结果,会抛出异常
- 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接口相关推荐
- JUC并发编程之Callable接口、JUC三大辅助类
目录 8. Callable接口 8.1 创建线程的多种方式 8.2 概述 8.3 用Callable接口创建Thred线程 8.4 小结(重点) 9. JUC 三大辅助类 9.1 概述 9.2 减少 ...
- [Java并发编程-6] Callable接口
文章目录 如何使用 理解FutrueTask 举个栗子 Callable接口和Runnale接口一样, 也能 创建新线程 Runnable接口和Callable接口的不同: 是否有返回值 是否抛出异常 ...
- 【尚硅谷】大厂必备技术之JUC并发编程——笔记总结
[JUC并发编程01]JUC概述 关键字:进程和线程.进程和线程.wait和sleep.并发与并行.管程.用户线程和守护线程 [JUC并发编程02]Lock接口 关键字:synchronized.Lo ...
- ❤️《JUC并发编程从入门到高级》(建议收藏)❤️
JUC并发编程 1.什么是JUC JUC的意思就是java并发编程工具包,与JUC相关的有三个包:java.util.concurrent.java.util.concurrent.atomic.ja ...
- 多线程进阶=》JUC并发编程02
在JUC并发编程01中说到了,什么是JUC.线程和进程.Lock锁.生产者和消费者问题.8锁现象.集合类不安全.Callable(简单).常用辅助类.读写锁 https://blog.csdn.net ...
- 基于《狂神说Java》JUC并发编程--学习笔记
前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...
- Java JUC并发编程详解
Java JUC并发编程详解 1. JUC概述 1.1 JUC简介 1.2 进程与线程 1.2 并发与并行 1.3 用户线程和守护线程 2. Lock接口 2.1 Synchronized 2.2 什 ...
- 多线程进阶=》JUC并发编程
多线程进阶=>JUC并发编程 1.什么是JUC JUC是java.util.concurrent的简写. 用中文概括一下,JUC的意思就是java并发编程工具包. 并发编程的本质就是 ...
- JUC并发编程(java util concurrent)(哔站 狂神说java juc并发编程 摘录笔记)
JUC并发编程(java util concurrent) 1.什么是JUC JUC并不是一个很神秘的东西(就是 java.util 工具包.包.分类) 业务:普通的线程代码 Thread Runna ...
最新文章
- Android移动开发之【Android实战项目】记一次app开发过程!
- Python基础之条件判断
- AI:人工智能的多模态融合模型的简介、发展以及未来趋势
- QEventLoop的简单使用(二)
- 较流行的4个开源协议
- python引入pytesseract报错:ValueError: Attempted relative import in non-package
- Packet Tracer 思科模拟器入门教程
- Linux笔记(十二) Linux集群搭建(附带视频详解)
- 微型计算机系统评课,微机课评课稿.doc
- 计算机网络技术 虚拟仿真教学实验,虚拟仿真实验教学优秀课件
- Win10 LTSC 2021长期服务企业版
- python selenium 点击加载更多_Python Selenium 疑难杂症解方(三): 点击
- python任务栏都隐藏了_如何隐藏PyQt4 Python应用程序的任务栏图标?
- N个鸡蛋放到M个篮子中
- 一个SAP开发人员的2017总结:编程与游泳
- Intel® 2019网络技术研讨会圆满落幕
- 安装Linux Mint 17后要做的20件事
- Linux下安装realtek8812au /8814au 驱动
- 人工智能导论--浙江工业大学--王万良
- 国家计算机职业技能鉴定4级考试内容大全