简介

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

参考链接

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. public boolean add(E e)的源码分析

    public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess ...

  2. 🎀maven 版本管理

    简介 Maven的versions插件提供了一系列用于处理项目版本的命令 相关命令 mvn versions:set 版本设置 mvn versions:set -DnewVersion=1.0.0- ...

  3. 什么是 Java 的 AOT(Ahead-Of-Time)?

    Java 的 AOT(Ahead-Of-Time) 1. 定义 AOT(Ahead-Of-Time)编译是与 JIT(Just-In-Time)相对的一种编译方式. 在 AOT 模式下,Java 字节 ...

  4. 【MOOC】JS脚本|便于复制粘贴中国大学MOOC网站的测试题和选项

    文章目录 运行结果 完整代码 可复用的部分 1. 删除指定Class或Id的DOM元素 2. 在页面上添加按钮并绑定事件.添加css.class 3. 等待页面加载完成,运行异步函数 4. 选中某个D ...

  5. 校园圈子系统:Uni-app跨端渲染+TP6实时推送核心逻辑与代码

    在TP6中实现实时推送功能,核心逻辑围绕WebSocket服务搭建.用户连接管理.消息路由和性能优化展开.以下是详细的实现步骤和逻辑说明: TP6实时推送核心逻辑 WebSocket服务搭建 使用Wo ...

  6. django实例(1)

    Urls.py from django.contrib import adminfrom django.conf.urls import urlfrom cmdb import viewsurlpat ...

  7. JavaScript编程的10+最佳实践解决方案

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  8. Flutter视频压缩技术:如何在应用中优化视频文件的质量和大小?

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  9. 市盈率指标EP在A股市场的分析

    因子经济金融特性 EP因子即市盈率因子,常被投资者使用的几个估值因子之一.一般使用PE,即Price to Earning, 维基百科上的解释:市盈率指每股市价除以每股盈利(Earning Per S ...

  10. 华为devcloud 自动构建和发布dotcore

    托管代码创建一个仓库 并提交项目代码 然后创建一个编译构建 构建步骤选择 Msbuild构建  工具版本选择最新版 powershell 命令:我这里直接复制文件夹不行,所以 执行powershell ...