面试题:java Runnable与Callable 的区别
相同点
- 都是接口;(废话,当然是接口了)
- 都可用来编写多线程程序;
- 都需要调用Thread.start()启动线程。
- Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
不同点
实现Callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程不能返回结果,这是核心区别;
注意点:Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!Callable接口的call()方法允许抛出异常,而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;
Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行。而Callable只能通过线程池执行。
Callable实战
下面是Callable的应用场景,用于求和并打印计算结果。
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class SumCallableImpl implements Callable<Long> {
private final long from;
private final long to;
SumCallableImpl(long from, long to) {
this.from = from;
this.to = to;
}
@Override
public Long call() {
long acc = 0;
for (long i = from; i <= to; i++) {
acc = acc + i;
}
System.out.println(Thread.currentThread().getName() + " : " + acc);
return acc;
}
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(3);
List<Future<Long>> results = executor.invokeAll(Arrays.asList(
new SumCallableImpl(0, 10), new SumCallableImpl(0, 1_000), new SumCallableImpl(0, 1_000_000)
));
executor.shutdown();
System.out.println("打印执行结果:");
for (Future<Long> result : results) {
System.out.println(result.get());
}
}
}
面试题:java Runnable与Callable 的区别的更多相关文章
- Java线程—-Runnable和Callable的区别和联系
Java 提供了三种创建线程的方法 1.继承Thread接口 public class Thread2Thread { public static void main(String[] args) { ...
- java中Runnable和Callable的区别
文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...
- Runnable和Callable 的区别
Runnable和Callable 的区别 01.Runnable接口中只有一个run()没有返回值 没有声明异常 Callable接口中只有一个call()有返回值 有声明异常 02.Calla ...
- Runnable 和 Callable的区别
Runnable 与 Callable的区别: (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable ...
- Java Runnable与Callable区别
接口定义 #Callable接口 public interface Callable<V> { V call() throws Exception; } #Runnable接口 publi ...
- java Runnable、Callable、FutureTask 和线程池
一:Runnable.Callable.FutureTask简介 (1)Runnable:其中的run()方法没有返回值. ①.Runnable对象可以直接扔给Thread创建线程实例,并且创建的线程 ...
- Runnable、Callable、Future和CompletableFuture
一.Runnable Runnable非常简单,只需要实现一个run方法即可,没有参数,也没有返回值.可以以new Thread的方式去运行,当然更好的方式在放到excutorPool中去运行. 二. ...
- Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask
多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的. ...
- Java多线程Runnable与Callable区别与拓展
我们先来分别看一下这两个接口 Runnable: // // Source code recreated from a .class file by IntelliJ IDEA // (powered ...
- Java中的Runnable、Callable、Future、FutureTask的区别与示例
Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...
随机推荐
- 面试题10- II. 青蛙跳台阶问题
地址:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/ <?php /** 一只青蛙一次可以跳上1级台阶,也可 ...
- win32绘图:绘制直线 矩形 圆形 曲线等
查看代码 #include <Windows.h> //画点 void PaintSetPixel(HDC hdc) { for (short i = 0; i < 20; i++) ...
- gorm事务的rollback和commit操作
一个事务内同一操作二次回滚(Rollback)会报错,二次提交(commit)也会报错, 如果回滚完又进行提交操作,一样会报错 循环注意把事务开启tx.Begin放在事务操作前边,操作完回滚或者提交
- golang中容易遇到的错误
前言 在循环中,有几种情况可能会导致混乱,需要弄清楚. 循环迭代器变量中使用引用 出于效率考虑,我们经常使用单个变量来循环迭代器.但在循环中,每次循环迭代中都会有不同的值,有时候会导致未知的行为. i ...
- 变异凯撒-python脚本调整ascii码转字符串
题目: 加密密文:afZ_r9VYfScOeO_UL^RWUc 格式:flag{ } 结合题目变异凯撒,第一个字符a到f加了5,第二个字符f到l加了6,推断每个字符都在前一个字符基础上+1. 编写py ...
- SpringBoot应用调用Linkis进行任务调度执行SQl;进行数据质量分析
基于Linkis的Rest-API调用任务 官网示例:"https://linkis.apache.org/zh-CN/docs/1.3.2/api/linkis-task-operator ...
- Python提取pdf文字信息
目录 Python提取pdf文字信息 需求 代码 总结 Python提取pdf文字信息 需求 今天教务处导出来我们全年级的成绩,一看吓一跳,我们的名字怎么不在文件名里,只能一个个找吗.事情开始变得离谱 ...
- 【Python自动化测试环境管理】tox
1. tox基本介绍 1.1 tox是什么? tox 是一个用于管理 Python 项目的自动化测试和环境管理工具.它的主要功能是创建虚拟环境并运行项目的测试套件,tox能够让我们在同一个Host上自 ...
- Sublime Text 3汉化教程
一.初始化插件仓库 ctrl+`(esc键下方那一个)打开控制台输入以下代码回车 import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df ...
- java基础之Scanner类、 Random类
一.使用Scanner类,完成接收键盘录入数据 格式: Scanner sc = new Scanner(System.in) sc.nextInt(); 二.获取1-n之间的随机数 格式: Rand ...