JUC—Callable接口
一、callable接口是什么?
面试题:
获得多线程的方法几种?
正确答案如下:
传统的 是继承thread类和实现runnable接口,
java5以后又有实现 callable接口 和 java的线程池获得
函数式接口
这是一个函数式接口,因此可以用作lambda表达式或方法引用的赋值对象 。
二、与runnable对比(实现方法对比)
面试题:callable接口与runnable接口的区别?
答:(1)是否有返回值
(2)是否抛异常
(3)落地方法不一样,一个是run,一个是call
创建新类MyThread实现runnable接口
class MyThread implements Runnable{
@Override
public void run() { }
}
新类MyThread2实现callable接口
class MyThread2 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return 200;
}
}
三、怎么用?
(1)直接替换runnable是否可行?
不可行,因为:thread类的构造方法根本没有Callable
这像认识一个不认识的同学,我可以找中间人介绍。
中间人是什么? java多态,一个类可以实现多个接口!!
FutureTask<Integer> ft = new FutureTask<Integer>( new MyThread());
new Thread( ft , "AA" ).start();
运行成功后如何获得返回值?
ft .get();
FutureTask
1、FutureTask是什么?
未来的任务,用它就干一件事,异步调用
main方法就像一个冰糖葫芦,一个个方法由main串起来。
但解决不了一个问题:正常调用挂起堵塞问题
例子:
( 1 )老师上着课,口渴了,去买水不合适,讲课线程继续,我可以单起个线程找班长帮忙买水,
水买回来了放桌上,我需要的时候再去 get 。
( 2 ) 4 个同学, A 算 1+20,B 算 21+30,C 算 31* 到 40,D 算 41+50 ,是不是 C 的计算量有点大啊,
FutureTask 单起个线程给 C 计算,我先汇总 ABD ,最后等 C 计算完了再汇总 C ,拿到最终结果
( 3 )高考:会做的先做,不会的放在后面做
2、原理
在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,
当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。
一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,
就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,
然后会返回结果或者抛出异常。
只计算一次
get方法放到最后
3、代码
package demo1; import java.util.concurrent.*; class MyThread implements Runnable{
@Override
public void run() {
System.out.println("继承runnable方法");
}
}
class MyThread2 implements Callable<Integer>{ @Override
public Integer call() throws Exception{
System.out.println(Thread.currentThread().getName()+"come in callable");
return 200;
}
} public class Callablelearn {
public static void main(String[] args) throws Exception{
/**
* 建立futureTask (创建中间人) 介绍线程与callable认识,
*
*/
// FutureTask<Integer> futureTask = new FutureTask(new MyThread2());
FutureTask<Integer> futureTask = new FutureTask<>(()->{
System.out.println(Thread.currentThread().getName()+"come in callable"); return 1024;
});
FutureTask<Integer> futureTask2 = new FutureTask<>(()->{
System.out.println(Thread.currentThread().getName()+"come in callable"); return 2048;
});
new Thread(futureTask,"zhangsan").start();
new Thread(futureTask2,"lisi").start();
while(!futureTask.isDone()){
System.out.println("------wait"); }
System.out.println(futureTask.get());
System.out.println(Thread.currentThread().getName()+"come over");
}
/**
* 在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,
* 当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。
*
* 一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
*
* 仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,
* 就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,
* 然后会返回结果或者抛出异常。
*
* 只计算一次
* get方法放到最后
*/
}
JUC—Callable接口的更多相关文章
- JUC之Callable接口回顾和JUC辅助类
Callable接口和JUC辅助类 Callable接口: 回顾: 创建线程的四种方式: 继承Thread 实现runnable接口 实现callable接口 使用线程池 之前的文章:多线程编程1-定 ...
- 实现多线程的方式之实现Callable接口
package com.hls.juc; import java.util.concurrent.Callable;import java.util.concurrent.ExecutionExcep ...
- 实现Callable接口创建线程
创建执行线程有四种方式: 实现implements接口创建线程 继承Thread类创建线程 实现Callable接口,通过FutureTask包装器来创建线程 使用线程池创建线程 下面介绍通过实现Ca ...
- 创建执行线程方式三:实现Callable接口
Callable接口 ① Java 5.0 在 java.util.concurrent 提供了一个新的创建执行 线程的方式:Callable 接口② Callable 接口类似于 Runnable, ...
- Callable接口、Runable接口、Future接口
1. Callable与Runable区别 Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理.Thread类.Runnable接口和Java内存管理模型使得多线 ...
- 线程池的应用及Callable接口的使用
public interface Executor { /** * Executes the given command at some time in the future. The comman ...
- [改善Java代码]异步运算考虑使用Callable接口
多线程有两种实现方式: 一种是实现Runnable接口,另一种是继承Thread类,这两种方式都有缺点,run方法没有返回值,不能抛出异常(这两个缺点归根到底是Runable接口的缺陷,Thread也 ...
- 多线程——实现Callable接口
前两篇博客(多线程--继承Thread类.多线程--实现Runnable接口 )介绍了java使用线程的两种方法.这篇博客继续介绍第三种方法--实现Callable接口. 先说一下Runnable和C ...
- Java多线程之Callable接口的实现
Callable 和 Future接口 Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务. Callable和Runn ...
随机推荐
- Linux下VIM编译器的使用以及shell编程基础
VIM编译器的安装与使用 vim编辑器安装 在CentOS中,执行:yum -y install vim 普通模式 h: 左移一个字符 j: 下移一行 k: 上移一行 l: 右移一个字符 PageDo ...
- 金融计算的开源库——QuantLib 学习入门
本文在Creative Commons协议下发布. 简介 瞬息万变的金融市场开发出了太多的金融产品,产生了太多的计算问题,这对于 Fintech 来讲:无论是计算能力上的,还是软件设计上的是一个巨大的 ...
- 9个常用的正则表达式-sunziren
正数字:/^[1-9]{1}[0-9]*$|^0{1}\.{1}[0-9]+$|^[1-9]{1}[0-9]*\.{1}[0-9]+$/ 用户名:/^[a-z0-9_-]{3,16}$/ 密码:/^[ ...
- 吴裕雄--天生自然 R语言开发学习:模块\包的安装命令
install.packages('模块包名称') 或者 install.packages('模块包名称',repos='http://cran.us.r-project.org')
- pycharm导入python包
总步骤:file --> settings --> poject interpreter --> 点击加号 --> 搜索需要导入的python包 --> 选中需要导入的p ...
- 使用mongoose--写接口
定义数据模型 import mongoose from 'mongoose' mongoose.connect('mongodb://localhost/edu') const advertSchem ...
- id、css命名规范
main热点:hot新闻:news下载:download子导航:subnav菜单:menu子菜单:submenu搜索:search友情链接:friendlink页脚:footer版权:copyrigh ...
- Intel 8086 常用汇编指令表
一.数据传输指令 它们在存贮器和寄存器.寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH ...
- 让bat文件自动以管理员身份运行
· 让bat文件自动以管理员身份运行 如何让bat文件自动以管理员身份运行,将这段写在bat文件的前头即可 : %1 mshta vbscript:CreateObject("Shell.A ...
- IntelliJ Pycharm 2019年最新版 安装激活教程【最强,可用至2089、2100年】
本文为2019年Pycharm最新版安装永久激活教程 PyCharm 2019.3 (Professional Edition) ①IntelliJ Pycharm 2019.3安装永久破解[最强] ...