相同点:

  1. 两者都是接口;(废话)
  2. 两者都可用来编写多线程程序;
  3. 两者都需要调用Thread.start()启动线程;

不同点:

  1. 两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;
  2. Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;

注意点:

  • Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!

Callable工作的Demo:

  1. package com.callable.runnable;
  2.  
  3. import java.util.concurrent.Callable;
  4. import java.util.concurrent.ExecutionException;
  5. import java.util.concurrent.FutureTask;
  6.  
  7. /**
  8. * Created on 2016/5/18.
  9. */
  10. public class CallableImpl implements Callable<String> {
  11.  
  12. public CallableImpl(String acceptStr) {
  13. this.acceptStr = acceptStr;
  14. }
  15.  
  16. private String acceptStr;
  17.  
  18. @Override
  19. public String call() throws Exception {
  20. // 任务阻塞 1 秒
  21. Thread.sleep(1000);
  22. return this.acceptStr + " append some chars and return it!";
  23. }
  24.  
  25. public static void main(String[] args) throws ExecutionException, InterruptedException {
  26. Callable<String> callable = new CallableImpl("my callable test!");
  27. FutureTask<String> task = new FutureTask<>(callable);
  28. long beginTime = System.currentTimeMillis();
  29. // 创建线程
  30. new Thread(task).start();
  31. // 调用get()阻塞主线程,反之,线程不会阻塞
  32. String result = task.get();
  33. long endTime = System.currentTimeMillis();
  34. System.out.println("hello : " + result);
  35. System.out.println("cast : " + (endTime - beginTime) / 1000 + " second!");
  36. }
  37. }

Runnable的Demo

  1. package com.callable.runnable;
  2.  
  3. /**
  4. * Created on 2016/5/18.
  5. */
  6. public class RunnableImpl implements Runnable {
  7.  
  8. public RunnableImpl(String acceptStr) {
  9. this.acceptStr = acceptStr;
  10. }
  11.  
  12. private String acceptStr;
  13.  
  14. @Override
  15. public void run() {
  16. try {
  17. // 线程阻塞 1 秒,此时有异常产生,只能在方法内部消化,无法上抛
  18. Thread.sleep(1000);
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. // 最终处理结果无法返回
  23. System.out.println("hello : " + this.acceptStr);
  24. }
  25.  
  26. public static void main(String[] args) {
  27. Runnable runnable = new RunnableImpl("my runable test!");
  28. long beginTime = System.currentTimeMillis();
  29. new Thread(runnable).start();
  30. long endTime = System.currentTimeMillis();
  31. System.out.println("cast : " + (endTime - beginTime) / 1000 + " second!");
  32. }
  33. }

转自

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

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

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

  2. Java Runnable与Callable区别

    接口定义 #Callable接口 public interface Callable<V> { V call() throws Exception; } #Runnable接口 publi ...

  3. java 并发包runnable 与 callable

    1.runnable 与 callable区别 2.避免callable执行完任务,获取返回结果时,阻塞其他子线程 下面固定线程池,设置4个,表明同时只有4个线程在执行任务,当某个线程执行完一个任务, ...

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

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

  5. Runnable和Callable之间的区别

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

  6. Runnable和Callable 的区别

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

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

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

  8. Runnable 和 Callable的区别

    Runnable 与 Callable的区别: (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable ...

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

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

随机推荐

  1. 关于SQL 导出脚本失败 及SQL 的重装

    说点题外话 最近跳到一家新公司 薪资比较客观 但是技术可能不太尽如人意 而且对.Net方向的开发好像不是很友好  自己也不知道该怎么办 一个人大老远跑这边来 附近也没有什么.net的公司和职位 房子租 ...

  2. 云笔记项目-Spring事务学习-传播NESTED

    接下来测试事务传播属性NESTED Service层 Service层方法事务传播属性都设置为NESTED. LayerT层代码 package LayerT; import javax.annota ...

  3. Google开源软负载seesaw

    https://github.com/google/seesaw ------------------------ 在分布式系统中,负载均衡是非常重要的环节,通过负载均衡将请求派发到网络中的一个或多个 ...

  4. git命令行获取某分支代码

    参考https://www.cnblogs.com/nylcy/p/6569284.html git clone -b branch1 http://xxx.xx.xxx... git clone - ...

  5. springboot+dubbo提示超时

    在消费方工程的application.properties里面加上dubbo.consumer.timeout=30000.

  6. jquery花式图片库——jqFancyTransitions

    http://www.html580.com/3785 https://yq.aliyun.com/ziliao/4390 使用方法调用插件js文件: <script src="js/ ...

  7. 高性能mysql 事务笔记

    事务的四大特性原子性.一致性.隔离性.持久性, 事务隔离的四大隔离级别: READ UNCOMMITTED(未提交读), 在 read uncommitted级别,事务中的修改,及时没有提交,对其他事 ...

  8. 20175314 《Java程序设计》第八周学习总结

    20175314 <Java程序设计>第八周学习总结 教材学习内容总结 安利一个非常实用的图片处理工具:图片工厂,它具有非常强大的图片批处理能力,比如加水印.降低画质.命名等,不仅如此它还 ...

  9. 20175234 2018-2019-2 《Java程序设计》第八周学习总结

    目录 20175234 2018-2019-2 <Java程序设计>第八周学习总结 教材学习内容总结 15.1泛型 15.2链表 15.3堆栈 15.4散列映射 15.5树集 15.6树映 ...

  10. js项目练习第一课

    控制div属性 <style> .c1 { width:200px; height:200px; background-color: #000; display: block; margi ...