runnable & callable
简介
简单来说这两个接口都是执行多线程里面使用的东西.
参考链接
https://blog.csdn.net/qq_41357573/article/details/88887566
区别
Java多线程有两个重要的接口,Runnable和Callable,分别提供了一个call方法和一个run方法
相同点
两者都是接口
两者都可以用来编写多线程程序
两者都可以调用Thread.start()来启动线程
不同点
两个最大的不同点就是:
能否返回结果
实现Callable接口的线程能够返回结果;
而实现Runnable接口的线程不能返回结果
能否抛出异常
Callable接口的call()方法允许抛出异常;
而Runnable接口的run方法的异常只能在内部消化,不能继续上抛。
Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行;而Callable只能通过线程池来执行。
Futrue & FutureTask
FutureTask可以用于闭锁,它实现了Future接口,表示一种可抽象的可产成结果的计算。
Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取结果,该方法会阻塞直到任务返回结果。
简单来说, Future 就是对于Runnable 和 Callable 进行了封装. 他可以查询线程是否执行完毕, 与执行结果等等.
code
/**
* Created by lee on 2021/6/4.
*/
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
/**
* 测试Callable
*
* @author qiang
*
*/
public class SolutionX implements Callable<String> {
private String arg;
public SolutionX(String arg) {
this.arg = arg;
}
public String call() throws Exception {
// 线程阻塞1秒,会返回这个异常
Thread.sleep(1000);
return this.arg + " append some chars and return it!";
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
Callable<String> callable = new SolutionX("world");
Future<String> futuretask = new FutureTask<>(callable);
Long beginTime = System.currentTimeMillis();
// 创键线程
new Thread((Runnable) futuretask).start();// Thread只接受Runnable类型的参数
// get方法会阻塞线程,反之返回结果
String result = futuretask.get();
long endTime = System.currentTimeMillis();
System.out.println("hello " + result);
System.out.println("cast :" + (endTime - beginTime) / 1000 + "second");
}
}
runnable & callable的更多相关文章
- java并发编程--Runnable Callable及Future
1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合Execu ...
- Java 多线程 socket 取款例子 runnable callable
socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465 取款部分参考 http://blog.csdn.net/dayday198 ...
- java多线程创建-Thread,Runnable,callable和threadpool
java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...
- ava EE 7 - Injection into Runnable/Callable object ejb entityManager Concurrency ManagedExecutorService 异步调用如何获取context
或者直接把 MyTask类内嵌如MyBean中,这样可以在myBean中inject 数据库连接,在内嵌类内访问. java ee 引入了并发执行.因为是在服务器执行并发,所以要用java ee包里面 ...
- java 多线程实现四种方式解析Thread,Runnable,Callable,ServiceExcutor,Synchronized ,ReentrantLock
1.Thread实现: import java.util.Date; import java.text.SimpleDateFormat; public class MyThread extends ...
- Runnable Callable及Future
https://www.cnblogs.com/MOBIN/p/6185387.html
- java 创建线程的三种方法Callable,Runnable,Thread比较及用法
转自:http://www.chinaitlab.com/Java/line/942440.html 编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.一般有三种方法,Thread, ...
- Callable,Runnable比较及用法
http://blog.csdn.net/xtwolf008/article/details/7713580 http://www.cnblogs.com/whgw/archive/2011/09/2 ...
- 并发,同步锁,Runnable,Callable,Future
1.并发: 在我们的操作系统中,同一个时间点,有N个线程都想访问同一个程序!但是cpu只能运行一个! 这种情况就是! 多个线程在 同一个时间点 访问同一个资源,会引发线程不安全的问题! 怎么解决这种不 ...
- Callable,Runnable的区别及用法
编写多线程程序一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别是: (1)Callable规定的方法是call(),Runnable规定的方 ...
随机推荐
- JavaScript 单线程原理与异步编程机制
JavaScript 单线程原理与异步编程机制 为什么 JavaScript 是单线程? JavaScript 被设计成单线程,简单来说就是 -- 浏览器里干活儿只能一个接一个排着队来,没法同时多开窗 ...
- kettle介绍-Step之Script Values/Mod(JavaScript 代码) 一
Script Values/Mod JavaScript 代码介绍 JavaScript 代码步骤提供了一个用户界面,用户可以编写 JavaScript 代码到脚本区,脚本区域中的每一行代码都会执行一 ...
- LVGL基础对象的框架、思维与概念,以及部分源码解析
概念: Lvgl虽然是以C语言进行编程开发,但其中借鉴了CSS当中编程思想,引入了类与对象的概念,其中lvgl的基础单位为控件,等同于HTML5当中的标签. Lvgl当中的"类"是 ...
- Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
企业级应用开发的需求日益增长.今天,我们要介绍的是一个在GitHub上广受好评的开源项目--Jeesite5.这不仅是一个技术框架,更是企业级应用开发的加速器.接下来,我们将深入探讨Jeesite5的 ...
- java模块——使用 47M 的java环境运行HelloWorld
前言 我们知道,运行java程序需要jre或jdk环境,但是现在的jdk安装包已经很大了,如果我们的程序很简单,并且需要把程序发送给其他没有jdk环境的人的运行要如何做呢?如何精简我们的程序包呢? 从 ...
- Wan2.1 t2v模型Lora Fine-Tune
Wan2.1 t2v模型Lora Fine-Tune 1. Wan2.1模型 Wan2.1是由阿里巴巴开源的AI视频生成大模型,具备强大的视觉生成能力,支持文本到视频(T2V)和图像到视频(I2V)任 ...
- Flex布局-子项
弹性盒子是一种用于 按行 或 按列的一维布局方法. 元素可以膨胀以填充额外的空间, 也可以 收缩 以适应更小的空间. flex 容器项重点 只是用表格进行排版而已, 横向内容无关联哈, 只是简要回忆一 ...
- 基于onnxruntime结合PyQt快速搭建视觉原型Demo
我在日常工作中经常使用PyQt和onnxruntime来快速生产demo软件,用于展示和测试,这里,我将以Yolov12为例,展示一下我的方案. 首先我们需要使用Yolov12训练一个模型,并 ...
- System.Runtime.Serialization.SerializationException:“二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。
var buffer = new byte[1024]; using (var ms = new MemoryStream(buffer)) { //xxx } 原因是buffer的长度过短,当接受到 ...
- 定制Django的Tag和Filter(一)
1.在 app 目录下创建 templatetags 目录(目录名只能是 templatetags). 如: app/ __init__.py models.py templatetags/ __in ...