Runable与Callable的区别:
public interface Callable<V> {
V call() throws Exception;//V是Callable返回值的类型
}
public interface Runnable {
public abstract void run();
}
Runable与Callable相同点:
1、两者都是接口;
2、两者都可用来编写多线程程序;
3、两者都需要调用Thread.start()启动线程;
不同点:
1、实现Callable接口的任务线程能返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取call()返回的结果;当不调用此方法时,主线程不会阻塞;而实现Runnable接口的任务线程不能返回结果;
2、Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;
 
 
Callable的3种启动线程的方式
1、Thread启动
public class CallableImpl implements Callable<String> {
private String acceptStr;
public CallableImpl(String acceptStr) {
this.acceptStr = acceptStr;
}
@Override
public String call() throws Exception {
// 任务等待1 秒
Thread.sleep(1000);
return this.acceptStr + ",hello!";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//Callable<String> callable = new CallableImpl("afei");
CallableImpl impl=new CallableImpl ("afei");
FutureTask<String> task = new FutureTask<String>(impl);
long beginTime = System.currentTimeMillis();
// 创建线程
new Thread(task).start();
// 调用get()阻塞主线程,反之,线程不会阻塞
String result = task.get();//阻塞主线程,直至1s后获取到call()的返回内容
System.out.println("hello : " + result);//返回:afei,hello!
}
}
2、ExecutorService 启动
public class CallableImpl implements Callable<String> {
private String acceptStr;
public CallableImpl(String acceptStr) {
this.acceptStr = acceptStr;
}
@Override
public String call() throws Exception {
// 任务等待1 秒
Thread.sleep(1000);
return this.acceptStr + ",hello!";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool(); // 创建线程池
// 向里面扔任务并执行该任务,同时返回一个包含call()方法返回值的Featured对象
CallableImpl impl=new CallableImpl(“afei");
Future<String> future=exec.submit(impl);
System.out.println(future.get()); //打印线程(任务)执行的结果
exec.shutdown();// 关闭线程池后不接受新任务,已经在线程池的任务会被执行完
}
}
3、controler方法中直接返回Callable对象或其派对象
@RestController
public class IAsyncController {
private Logger logger=LoggerFactory.getLogger(getClass());

@PostMapping("/async/back")
public Callable<String> back(){
logger.info("主线程开始");
Callable<String> c=new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
logger.info("副线程开始等待1s...");
Thread.sleep(1000);
logger.info("副线程结束等待");
return "afei";
}
};
logger.info("主线程结束并返回");
return c;//启动副线程并返回call()的返回值
}
}
Runnable的3种启动线程的方式:
1、继承Thread类
public class Test extends Thread{
public void run(){
//操作临界资源
}
public static void main(String[] args){
Test t=new Test();
t.start();//启动线程
}
}
2、继承Runnable接口
public class Test implements Runnable{
public void run(){
//操作临界资源
}
public static void main(String[] args){
Test t=new Test();
Thread thread=new Thread(t);
thread.start();//启动线程
}
}
3、无名线程
public class Test{
public static void main(String[] args){
new Thread(()->{ //启动一个线程
System.out.pritln("启动一个线程);
}).start();
}
}

Runable与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. Runnable 和 Callable的区别

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

  4. java中Runnable和Callable的区别

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

  5. java中高级

    面试问题: 一.Java基础方面: 1.Java面相对象的思想的理解(主要是多态): http://blog.csdn.net/zhaojw_420/article/details/70477636 ...

  6. java中高级面试题整理及参考答案

    面试问题: 一.Java基础方面: 1.Java面相对象的思想的理解(主要是多态): http://blog.csdn.net/zhaojw_420/article/details/70477636 ...

  7. Java中线程和线程池

    Java中开启多线程的三种方式 1.通过继承Thread实现 public class ThreadDemo extends Thread{ public void run(){ System.out ...

  8. java多线程并发(一)-- 相关基础知识

    java多线程的知识是java程序员都应该掌握的技能,目前我接触的项目上用的不多,花点时间熟悉熟悉. 一.基础知识 1.什么是进程? 进程是具有一定独立功能的正在运行过程中的程序,是操作系统进行资源分 ...

  9. 《Java多线程面试题》系列-创建线程的三种方法及其区别

    1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...

随机推荐

  1. 面试官:知道ThreadLocal嘛?谈谈你对它的理解?(基于jdk1.8)

    https://zhuanlan.zhihu.com/p/99150038   ​ 西北工业大学 计算机技术硕士在读 在java的多线程模块中,ThreadLocal是经常被提问到的一个知识点,提问的 ...

  2. 解释AOP?

    面向切面的编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理.

  3. mac终端所有命令不能用

    最近一次在用终端敲命令的时候发现命令总是不执行(只有cd命令可以正常执行),返回命令未识别的错误-bash: source: command not found 相信很多朋友也会遇到类似的问题. 解决 ...

  4. java -的字符串hei

    字符串的不可变 String 对象是不可变的.查看 JDK 文档你就会发现,String 类中每一个看起来会修改 String 值的方法,实际上都是创建了一个全新的 String 对象,以包含修改后的 ...

  5. chubby 是什么,和 zookeeper 比你怎么看?

    chubby 是 google 的,完全实现 paxos 算法,不开源.zookeeper 是 chubby的开源实现,使用 zab 协议,paxos 算法的变种.

  6. SpringAOP+RabbitMQ+WebSocket实战

    背景 最近公司的客户要求,分配给员工的任务除了有微信通知外,还希望PC端的网页也能实时收到通知.管理员分配任务是在我们的系统A,而员工接受任务是在系统B.两个系统都是现在已投入使用的系统. 技术选型 ...

  7. idea常见设置一

    1.顶部执行栏调整 原: 设置:勾选view==>toolbar 后: 这个一看其实没有什么太大的作用,但是你看这个按钮 这个按钮就是File==>Settings,这样会稍微方便点,只要 ...

  8. Effective Java —— 谨慎覆盖clone

    本文参考 本篇文章参考自<Effective Java>第三版第十三条"Always override toString",在<阿里巴巴Java开发手册>中 ...

  9. 微信APP支付V3版本签名 && APP下单/订单查询接口Python版实现

    问题背景 最近接入微信支付,微信官方并没有提供Python版的服务端SDK,因而只能根据文档手动实现一版,这里记录一下微信支付的整体流程.踩坑过程与最终具体实现. 微信支付APP下单流程 根据微信官方 ...

  10. Vue报错之"[Vue warn]: Invalid prop: type check failed for prop "jingzinum". Expected Number with value NaN, got String with value "fuNum"."

    一.报错截图 [Vue warn]: Invalid prop: type check failed for prop "jingzinum". Expected Number w ...