Runnable 与 Callable的区别:

(1)Callable规定的方法是call(),Runnable规定的方法是run().

(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的

(3)call方法可以抛出异常,run方法不可以

(4)运行Callable任务可以拿到一个Future对象,Future 表示异步计算的结果。(PS: 特别注意,executorService.submit(Runnable task) 也会返回future, 但是没有future的效果 )

Future接口:

Future接口代表异步计算的结果,通过Future接口提供的方法可以查看异步计算是否执行完成,或者等待执行结果并获取执行结果,同时还可以取消执行。

public interface Future {

  boolean cancel(boolean mayInterruptIfRunning);//取消任务

  boolean isCancelled(); //是否取消了

  boolean isDone(); //任务是否完成

  V get() throws InterruptedException, ExecutionException; //获取任务执行结果,如果任务还没完成则会阻塞等待直到任务执行完成

  V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; //等待一段时间尝试获取执行结果
}

一个使用Runnable的简单例子:

public class RunnableTest {
// 创建线程池
private static final ExecutorService executorService = Executors.newFixedThreadPool(5); public static void main(String[] args) {
Runnable task = () -> {
System.out.println("thread name [" + Thread.currentThread().getName() + "]");
System.out.println("task running ......"); try {
Thread.sleep(1000 * 20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task end ......");
}; executorService.submit(task); // 关闭线程池
executorService.shutdown();
}

一个使用Callable的简单例子: 

public class CallableTest {
// 创建线程池
private static final ExecutorService executorService = Executors.newFixedThreadPool(5); public static void main(String[] args) {
// 创建task
Callable task = () -> {
System.out.println("Thread name [" + Thread.currentThread().getName() + "]");
System.out.println("task running ......");
Thread.sleep(1000 * 20);
System.out.println("task end ......");
return "call return";
}; Future result = executorService.submit(task); while(!result.isDone()) {
System.out.println("waiting task end ......");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} try {
System.out.println("thread end, return : " + result.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} // 关闭线程池
executorService.shutdown();
}
}

Runnable 和 Callable的区别的更多相关文章

  1. Runnable和Callable 的区别

    Runnable和Callable 的区别 01.Runnable接口中只有一个run()没有返回值 没有声明异常   Callable接口中只有一个call()有返回值 有声明异常 02.Calla ...

  2. Java线程—-Runnable和Callable的区别和联系

    Java 提供了三种创建线程的方法 1.继承Thread接口 public class Thread2Thread { public static void main(String[] args) { ...

  3. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  4. Runnable、Callable、Future和CompletableFuture

    一.Runnable Runnable非常简单,只需要实现一个run方法即可,没有参数,也没有返回值.可以以new Thread的方式去运行,当然更好的方式在放到excutorPool中去运行. 二. ...

  5. Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask

    多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的. ...

  6. Java多线程Runnable与Callable区别与拓展

    我们先来分别看一下这两个接口 Runnable: // // Source code recreated from a .class file by IntelliJ IDEA // (powered ...

  7. Runnable和Callable之间的区别

    Runnable和Callable之间的区别 1.Runnable任务执行后没有返回值:Callable任务执行后可以获得返回值 2.Runnable的方法是run(),没有返回值:Callable的 ...

  8. 说一下 runnable 和 callable 有什么区别?(未完成)

    说一下 runnable 和 callable 有什么区别?(未完成)

  9. Java中的Runnable、Callable、Future、FutureTask的区别与示例

    Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...

随机推荐

  1. 解决dvajs使用BrowserHistory路由模式后仍然会出现hash(哈希)

    在dvajs中,如果你在初始化dva对象的时候不作任何处理,那么你就会发现即使你是用了BrowserRouter来作为Router url中也是会出现#/.解决方法也很简单: 使用前先手动安装下 hi ...

  2. visual studio 插件 resharper 使用指南

    vs虽然号称是宇宙第一ide,但在智能提示和代码分析方面还是要略逊于jetbrains系列的ide.如果将jetbrains系列ide的智能提示和代码分析集成到vs中,对vs来说无异于如虎添翼.res ...

  3. php的session与免登陆问题

    Session 与 Session的GC 由于PHP的工作机制,它并没有一个daemon线程来定期的扫描Session 信息并判断其是否失效,当一个有效的请求发生时,PHP 会根据全局变量 sessi ...

  4. Linux下Shell脚本字符串单引号、双引号、反引号、反斜杠的作用和区别

    一.单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单引号(对单引号使用转义符后也不行) ...

  5. f5长连接策略

    但是把这些短连接汇聚到一起,集中F5的设备上,通过F5与服务器建立平滑的长连接,就解决了不断增大的并发连接.比如说前台有15万个并发连接,经过F5的优化,在服务器上只有不到5000个并发连接,而且在此 ...

  6. app中获取应用名称,版本等信息的方法

    在app中,我们有时候需要显示一些信息,例如名称,版本等等...如果用写死的方式可能不太好,我们可以动态的读取.应用的信息主要是在info.plist这个文件中,实际就是一个xml文件,以源文件的方式 ...

  7. [置顶] 一个简单好用的zabbix告警信息发送工具

    之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛 ...

  8. 利用js实现table增加一行

    简单的方法: 用jquery插件,比如设置该table的id为mytable <table id="mytable"> <tr> <td> 第一 ...

  9. mysql数据库查看各实例磁盘占用情况

    1.总体查看: use information_schema; select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' ...

  10. H5 性能调优 工具

    1.阿里测:http://www.alibench.com 2.奇云测:http://ce.cloud.360.cn 3.百度应用性能检测中心:http://apm.baidu.com 推荐理由:这3 ...