Java JUC并发之Callable接口
时间:2021-07-15
本文章向大家介绍Java JUC并发之Callable接口,主要包括Java JUC并发之Callable接口使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
七、 Callable
相较于Runnable来说,Callable => :
- 可以有返回值
- 可以抛出异常
- 方法不同, run() => Runnable、 call() => Callable
代码测试
package com.liu.callable;
import java.util.concurrent.*;
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// new Thread( new Runnable() ).start();
// new Thread( new FutureTask<V>() ).start();
// new Thread( new FutureTask<V>( Callable) ).start();
// new Thread().start() 怎么启动Callable 使用适配类 FutureTask
MyThread thread = new MyThread();
FutureTask futureTask = new FutureTask(thread); // FutureTask => 适配类
new Thread(futureTask,"A").start();
new Thread(futureTask,"B").start(); // 结果会被缓存,可以提高效率
String r = (String) futureTask.get(); // 获取返回结果 get()可能会产生阻塞 将它放到最后 或者 使用异步通信
System.out.println(r);
/* // 创建执行服务
ExecutorService service = Executors.newFixedThreadPool(1);
// 提交执行
Future<String> res = service.submit(thread);
// 获得执行结果
try {
String r = res.get();
System.out.println(r);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
// 关闭服务
service.shutdown();*/
}
}
class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("call()");
return "ybb";
}
}
FutureTask源码中的run() :
private volatile int state;
private static final int NEW = 0;
private static final int COMPLETING = 1;
private static final int NORMAL = 2;
private static final int EXCEPTIONAL = 3;
private static final int CANCELLED = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED = 6;
public void run() {
// 如果线程已经被执行过一次(不处于新生状态),则直接返回
// 对 FutureTask中 的 volatile 类型的变量 state(当前线程的状态) 进行判断
if (state != NEW ||
!RUNNER.compareAndSet(this, null, Thread.currentThread()))
return;
try {
Callable<V> c = callable;
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call();
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
setException(ex);
}
if (ran)
set(result);
}
} finally {
// runner must be non-null until state is settled to
// prevent concurrent calls to run()
runner = null;
// state must be re-read after nulling runner to prevent
// leaked interrupts
int s = state;
if (s >= INTERRUPTING)
handlePossibleCancellationInterrupt(s);
}
}
总结:
- Callable可以有返回值,也可以抛出异常;
- Callable需要使用适配类FutureTask来启动;
- Callable实现的多线程有缓存,结果可能需要等待,会阻塞!
本文来自博客园,作者:{夕立君},转载请注明原文链接:https://www.cnblogs.com/liuzhhhao/p/15016377.html
原文地址:https://www.cnblogs.com/liuzhhhao/p/15016377.html
- 您需要来一份82年的代理吗?No.12
- Python 列表生成式(List Comprehensions)
- 微信小程序开发日记:重要的var that=this
- linux学习第二十六篇:正则介绍,grep,sed,awk命令
- Python 迭代(iteration)
- Python 切片(Slice)
- Python函数参数总结(位置参数、默认参数、可变参数、关键字参数和命名关键字参数)
- linux学习第二十七篇:使用w查看系统负载,vmstat,top,sar,nload命令
- Python 函数
- Python set(集合) 这一定是最全的介绍集合的博文
- Spark你一定学得会(二)No.8
- Python dict(字典)
- Python 条件判断
- linux学习第二十五篇:cut,sort,wc,uniq,tee,tr,split命令,shell特殊符号
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- MySQL|update字段为相同的值是否会记录binlog
- 微服务配置 Config 与消息总线
- 贷款违约预测-Task5 模型融合
- Python字符串
- MYSQL logstash 同步数据到es的几种方案对比以及每种方案数据丢失原因分析。
- 手写“SpringBoot”:几十行代码基于Netty搭建一个 HTTP Server
- SpringCloud Sleuth 分布式请求链路追踪
- StarUML 使用方法
- nacos 服务注册与配置中心
- sql语句中(+)的作用
- 1.7 C++运算符
- 探花交友_搭建开发环境
- 编程体系结构(04):JavaIO流文件管理
- Hadoop框架:HDFS简介与Shell管理命令
- OpenCV的Mat类型以及基本函数使用