简介

简单来说这两个接口都是执行多线程里面使用的东西.

参考链接

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的更多相关文章

  1. java并发编程--Runnable Callable及Future

    1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合Execu ...

  2. Java 多线程 socket 取款例子 runnable callable

    socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465 取款部分参考 http://blog.csdn.net/dayday198 ...

  3. java多线程创建-Thread,Runnable,callable和threadpool

    java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...

  4. ava EE 7 - Injection into Runnable/Callable object ejb entityManager Concurrency ManagedExecutorService 异步调用如何获取context

    或者直接把 MyTask类内嵌如MyBean中,这样可以在myBean中inject 数据库连接,在内嵌类内访问. java ee 引入了并发执行.因为是在服务器执行并发,所以要用java ee包里面 ...

  5. java 多线程实现四种方式解析Thread,Runnable,Callable,ServiceExcutor,Synchronized ,ReentrantLock

    1.Thread实现: import java.util.Date; import java.text.SimpleDateFormat; public class MyThread extends ...

  6. Runnable Callable及Future

    https://www.cnblogs.com/MOBIN/p/6185387.html

  7. java 创建线程的三种方法Callable,Runnable,Thread比较及用法

    转自:http://www.chinaitlab.com/Java/line/942440.html 编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.一般有三种方法,Thread, ...

  8. Callable,Runnable比较及用法

    http://blog.csdn.net/xtwolf008/article/details/7713580 http://www.cnblogs.com/whgw/archive/2011/09/2 ...

  9. 并发,同步锁,Runnable,Callable,Future

    1.并发: 在我们的操作系统中,同一个时间点,有N个线程都想访问同一个程序!但是cpu只能运行一个! 这种情况就是! 多个线程在 同一个时间点 访问同一个资源,会引发线程不安全的问题! 怎么解决这种不 ...

  10. Callable,Runnable的区别及用法

    编写多线程程序一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别是: (1)Callable规定的方法是call(),Runnable规定的方 ...

随机推荐

  1. JavaScript 单线程原理与异步编程机制

    JavaScript 单线程原理与异步编程机制 为什么 JavaScript 是单线程? JavaScript 被设计成单线程,简单来说就是 -- 浏览器里干活儿只能一个接一个排着队来,没法同时多开窗 ...

  2. kettle介绍-Step之Script Values/Mod(JavaScript 代码) 一

    Script Values/Mod JavaScript 代码介绍 JavaScript 代码步骤提供了一个用户界面,用户可以编写 JavaScript 代码到脚本区,脚本区域中的每一行代码都会执行一 ...

  3. LVGL基础对象的框架、思维与概念,以及部分源码解析

    概念: Lvgl虽然是以C语言进行编程开发,但其中借鉴了CSS当中编程思想,引入了类与对象的概念,其中lvgl的基础单位为控件,等同于HTML5当中的标签. Lvgl当中的"类"是 ...

  4. Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器

    企业级应用开发的需求日益增长.今天,我们要介绍的是一个在GitHub上广受好评的开源项目--Jeesite5.这不仅是一个技术框架,更是企业级应用开发的加速器.接下来,我们将深入探讨Jeesite5的 ...

  5. java模块——使用 47M 的java环境运行HelloWorld

    前言 我们知道,运行java程序需要jre或jdk环境,但是现在的jdk安装包已经很大了,如果我们的程序很简单,并且需要把程序发送给其他没有jdk环境的人的运行要如何做呢?如何精简我们的程序包呢? 从 ...

  6. Wan2.1 t2v模型Lora Fine-Tune

    Wan2.1 t2v模型Lora Fine-Tune 1. Wan2.1模型 Wan2.1是由阿里巴巴开源的AI视频生成大模型,具备强大的视觉生成能力,支持文本到视频(T2V)和图像到视频(I2V)任 ...

  7. Flex布局-子项

    弹性盒子是一种用于 按行 或 按列的一维布局方法. 元素可以膨胀以填充额外的空间, 也可以 收缩 以适应更小的空间. flex 容器项重点 只是用表格进行排版而已, 横向内容无关联哈, 只是简要回忆一 ...

  8. 基于onnxruntime结合PyQt快速搭建视觉原型Demo

      我在日常工作中经常使用PyQt和onnxruntime来快速生产demo软件,用于展示和测试,这里,我将以Yolov12为例,展示一下我的方案.   首先我们需要使用Yolov12训练一个模型,并 ...

  9. System.Runtime.Serialization.SerializationException:“二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。

    var buffer = new byte[1024]; using (var ms = new MemoryStream(buffer)) { //xxx } 原因是buffer的长度过短,当接受到 ...

  10. 定制Django的Tag和Filter(一)

    1.在 app 目录下创建 templatetags 目录(目录名只能是 templatetags). 如: app/ __init__.py models.py templatetags/ __in ...