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 ...
随机推荐
- 每天一个linux命令:tail(16)
tail tail命令用于输入文件中的尾部内容,不指定文件时,作为输入信息进行处理.tail命令默认在屏幕上显示指定文件的末尾10行.命令从指定点开始将文件写到标准输出,使用tail命令的-f选项可以 ...
- Fmx在android下InputBox输入框点击Cancel取消按钮后报异常
在网上搜索半天也没有找到相关信息,估计遇到这个问题的相当少, 解决办法: 找到FMX.Dialogs.Android.pas, 将121行中 FValues[I] := FDefaultValues ...
- Optional常用操作
1. 常见操作 @Test public void test1() { F f = new F(); // of(非null对象) Optional<F> fOptional = Opti ...
- 深度学习中的batch、epoch、iteration的含义
深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看一遍, ...
- java 序列化机制
package stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io ...
- CodeForces - 1051D (线性DP)
题目:https://codeforces.com/problemset/problem/1051/D 题意:一个2行n列的矩形,上面有黑白块,然后问你怎么布置才能有k个连通块,问有多少种方案数 思路 ...
- .net core linux的守护进程 supervisor
这个介绍的很全面,对初学者来说可以有更好的认识: https://www.cnblogs.com/savorboard/p/dotnetcore-supervisor.html
- 测开之路四十八:Django之重定向与cookie
基础配置与上一篇一致 404错误 定义一个error页面 <!DOCTYPE html><html lang="en"><head> <m ...
- vue项目在IE下显示空白打不开问题
近期遇到了项目是vue做的,在IE浏览器下打不开,显示空白问题,解决方案如下: 打不开的原因是因为少了babel-polyfill处理器,所以第一步需要下载: npm install babel-po ...
- Java迭代器模式
迭代器模式是Java和.Net编程环境中非常常用的设计模式.此模式用于以顺序方式访问集合对象的元素,而不需要知道其底层表示. 迭代器模式属于行为模式类别. 实现实例 在这个实例中,将创建一个Itera ...