JavaSE---多线程---Callable、Future
1、概述
1.1 JDK1.5后,Java提供了Callable接口,该接口提供 一个call方法 作为 线程执行体,该call方法可以 有返回值、声明抛出异常;
因此,我们可以直接将Callable接口作为target来创建线程,但是:Callable接口是新增的接口,不是Runnable的实现类;
JDK1.5后 又 提供了Future接口 代表 Callable接口的call()的 返回值,
并提供 Future接口的实现类FutureTask(该类实现了Runnable接口、Futrure接口,可以 作为Thread的target);
1.2 创建、启动有返回值的线程:
1.2.1 创建Callable接口的实现类,实现call方法;
1.2.2 创建实现类的实例,并用FutureTask进行封装;
1.2.3 使用FutureTask的实例作为Thread的target创建Thread实例、调用start()开启线程;
1.2.4 调用FutureTask实例的方法来获得子线程执行后的返回值;
package com.an; import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class CallableImpl implements Callable {
/**
* 线程执行体
* @return
* @throws Exception
*/
public Object call() throws Exception {
int i=0;
for (;i<10;i++){ }
return i;
} public static void main(String[] args)throws Exception{
for (int i=0;i<30;i++){
System.out.println(Thread.currentThread().getName()+"="+i);
if (i==5){
FutureTask futureTask=new FutureTask(new CallableImpl());
Thread thread=new Thread(futureTask,"有返回值的线程");
thread.start();
thread.join();
System.out.println(futureTask.get());
}
} }
}
1.3、FutureAPI

1.4、实战
package com.an.thread.callable; import java.util.concurrent.Callable; /**
* @description:
* @author: anpeiyong
* @date: Created in 2020/1/18 10:33
* @since:
*/
public class MyTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("线程执行开始...");
int i=1/0;
return 1;
}
}
package com.an.thread.callableandfuture; import java.util.concurrent.*; /**
* @description:
* @author: anpeiyong
* @date: Created in 2020/1/18 10:34
* @since:
*/
public class Test { public static void main(String[] args) { // testManThread();
testThreadPool();
} /**
* 手动创建线程
*/
public static void testManThread(){
FutureTask<Integer> futureTask=new FutureTask<>(new MyTask());
new Thread(futureTask).start();
try {
int a=(Integer) futureTask.get();
System.out.println(a);
}catch (Exception e){
System.out.println("异常了:"+e);
}
} /**
* 线程池使用
*
*/
public static void testThreadPool(){
ThreadPoolExecutor executor=new ThreadPoolExecutor(10,10,20, TimeUnit.SECONDS,new ArrayBlockingQueue<>(10));
//-----------------第一种:自定义任务、线程池提交任务
// executor.submit() 只需要提交任务即可,无需FutureTask封装
// Future<Integer> future=executor.submit(new MyTask()); //-----------------第二种:不用自定义任务、线程池通过内部类提交任务
Future future=executor.submit(()->{
System.out.println("线程执行开始...");
int i=1/0;
return 1;
});
try {
int a=(Integer) future.get();
System.out.println(a);
}catch (Exception e){
System.out.println("异常了:"+e);
}finally {
executor.shutdown();
} }
}
JavaSE---多线程---Callable、Future的更多相关文章
- 多线程-Callable、Future、FutureTask
我们普遍知道的创建线程的方式有两种,一种是继承Thread,一种是实现Runnable接口.这两种方式都无法获取任务执行完后的结果,并发包提供了Callable 类能够得到任务执行完的结果. 为何需要 ...
- Java线程池(Callable+Future模式)
转: Java线程池(Callable+Future模式) Java线程池(Callable+Future模式) Java通过Executors提供四种线程池 1)newCachedThreadPoo ...
- 13.多线程设计模式 - Future模式
多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...
- Java 并发编程——Callable+Future+FutureTask
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- 12 Callable & Future & FutureTask
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用 ...
- java 并发runable,callable,future,futureTask
转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html package future_call; import java.util.concurre ...
- 多线程设计模式 - Future模式
Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...
- Java Callable Future Example(java 关于Callable,Future的例子)
Home » Java » Java Callable Future Example Java Callable Future Example April 3, 2018 by Pankaj 25 C ...
- Java并发编程:ThreadPoolExecutor + Callable + Future(FutureTask) 探知线程的执行状况
如题 (总结要点) 使用ThreadPoolExecutor来创建线程,使用Callable + Future 来执行并探知线程执行情况: V get (long timeout, TimeUnit ...
- Java多线程 - Callable和Future
已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...
随机推荐
- Mac OS 10.15系统入门教程 系统语言输入法详解
对于一些Mac新手来说呢还不知道偏好设置到底是什么?有什么用处?其实Mac系统内的几乎所有的系统相关的设置都会在系统偏好设置内出现. 切换系统语⾔在语言与地区设置中拖拽左侧的语言条目就可以切换系统的语 ...
- 【leetcode】1032. Stream of Characters
题目如下: Implement the StreamChecker class as follows: StreamChecker(words): Constructor, init the data ...
- 【leetcode】592. Fraction Addition and Subtraction
题目如下: 解题思路:本题考察的是分数的加减法.小学时候就学过,分数的加减法是先求两个分母的最小公倍数,然后分子分别乘以最小公倍数与自己分母的商,相加后约分即可.所以,本题只要按+,-两个符号分割输入 ...
- Delphi Win API 函数 [ ShellAPI ] ShellExecute 函数
引用单元:uses ShellAPI; 函数原型:function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory ...
- mybatis源码分析之06二级缓存
上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的. 通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置 &l ...
- JAVA(JDK,JRE)更改目录安装及环境变量配置
重温一下 JAVA(JDK,JRE)更改目录安装及环境变量配置 https://jingyan.baidu.com/article/e2284b2b5b7ae5e2e7118d11.html 备注:随 ...
- [CSP-S模拟测试]:画作(BFS+数学)
题目描述 小$G$的喜欢作画,尤其喜欢仅使用黑白两色作画.画作可以抽象成一个$r\times c$大小的$01$矩阵.现在小$G$构思好了了他的画作,准备动笔开始作画.初始时画布是全白的,他每一次下笔 ...
- iOS 获取全局唯一标示符
这个方法用来产生一个唯一的标示符,每次调用都会不一样,所以可以用当作一些临时缓存文件的名字 NSString *identifier = [[NSProcessInfo processInfo] gl ...
- (转)教你分分钟搞定Docker私有仓库Registry
转:https://www.cnblogs.com/Javame/p/7389093.html 一.什么是Docker私有仓库Registry 官方的Docker hub是一个用于管理公共镜像的好地方 ...
- 同时连接gitlab和github
---恢复内容开始--- 原文地址:https://juejin.im/post/5ac0cf356fb9a028df22c246 1. 分别生成gitlab和github的ssh key 生成第一个 ...