首页

文章

java中runnable和callable的区别

发布网友 发布时间:2022-04-20 04:05

我来回答

3个回答

热心网友 时间:2022-06-03 12:55

展开3全部

1、意义区别:

Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;

Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

2、使用方法区别:

定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

举例说明:

package org.thread.demo;

class MyThread extends Thread{

private String name;

public MyThread(String name) {

super();

this.name = name;
}

public void run(){

for(int i=0;i<10;i++){

System.out.println("线程开始:"+this.name+",i="+i);
}

热心网友 时间:2022-06-03 12:56

Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以

(4)运行Callable任务可以拿到一个Future对象,Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如果线程没有执行完,Future.get()方法可能会阻塞当前线程的执行;如果线程出现异常,Future.get()会throws InterruptedException或者ExecutionException;如果线程已经取消,会跑出CancellationException。取消由cancel 方法来执行。isDone确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明Future<?> 形式类型、并返回 null 作为底层任务的结果。Future接口的定义如下:

Future模式
Future模式在请求发生时,会先产生一个Future凭证给发出请求的客户,它的作用就像是Proxy物件,同时,由一个新的执行线程持续进行目标物件的生成(Thread-Per-Message),真正的目标物件生成之后,将之设定至Future之中,而当客户端真正需要目标物件时,目标物件也已经准备好,可以让客户提取使用。
结合JDK的Future来看,就是你run线程后,你可以把线程的返回值赋给Future并返回一个Future对象。这时你可以立即拿到这个对象,然后进行下面的逻辑。但是如果你要get这个Future中的线程结果,就会被阻塞直到线程结束。
就相当于现在的期房,你把手续和钱都交上去了,就可以马上拿到合同,但只有合同没有房子。这个时候你已经是有房一族了,你可以先去买家电买装修(走下面的其他逻辑)。但是你要把家电和装修放进去,就必须等到房子完工(阻塞)。

public interface Future<T>
{
V get() throws ...;
V get(long timeout, TimeUnit unit) throws ...;
void cancle(boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}
具体的实现类为java.util.concurrent.FutureTask<V>。

1、通过实现Callable接口来创建Thread线程:

其中,Callable接口(也只有一个方法)定义如下:

public interface Callable<V>
{
V call() throws Exception;
}
步骤1:创建实现Callable接口的类SomeCallable<Integer>;

步骤2:创建一个类对象:

Callable<Integer> oneCallable = new SomeCallable<Integer>();

步骤3:由Callable<Integer>创建一个FutureTask<Integer>对象:

FutureTask<Integer> oneTask = new FutureTask<Integer>(oneCallable);
FutureTask<Integer>是一个包装器,它通过接受Callable<Integer>来创建,它同时实现了Future和Runnable接口,他的run方法中实际上会调用oneCallable.call()。

步骤4:由FutureTask<Integer>创建一个Thread对象:

Thread oneThread = new Thread(oneTask);

步骤5:启动线程:

oneThread.start();

2、通过线程池来创建线程:

步骤1:创建线程池:

ExecutorService pool = Executors.newCachedThreadPool();

步骤2:通过Runnable对象或Callable对象将任务提交给ExecutorService对象:

Future<Integer> submit(Callable<Integer> task);

网上的例子

[java] view plain copy print?
import java.util.concurrent.*;

public class Test {

public static void main(String[] args) throws InterruptedException,
ExecutionException {
final ExecutorService exec = Executors.newFixedThreadPool(5);
Callable<String> call = new Callable<String>() {
public String call() throws Exception {
Thread.sleep(1000 * 10);//休眠指定的时间,此处表示该操作比较耗时
return "Other less important but longtime things.";
}
};
Future<String> task = exec.submit(call);
//重要的事情
System.out.println("Let's do important things. start");
Thread.sleep(1000 * 3);
System.out.println("Let's do important things. end");

//不重要的事情
while(! task.isDone()){
System.out.println("still waiting....");
Thread.sleep(1000 * 1);
}
System.out.println("get sth....");
String obj = task.get();
System.out.println(obj);
//关闭线程池
exec.shutdown();
}
}

输出结果:

Let's do important things. start
Let's do important things. end
still waiting....
still waiting....
still waiting....
still waiting....
still waiting....
still waiting....
still waiting....
get sth....
Other less important but longtime things.

热心网友 时间:2022-06-03 12:56

Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以

(4)运行Callable任务可以拿到一个Future对象,Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如果线程没有执行完,Future.get()方法可能会阻塞当前线程的执行;如果线程出现异常,Future.get()会throws InterruptedException或者ExecutionException;如果线程已经取消,会跑出CancellationException。取消由cancel 方法来执行。isDone确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明Future<?> 形式类型、并返回 null 作为底层任务的结果。
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 callable 和 future 的区别 Java的Runnable,Callable,Future,FutureTask有... 设置里面微信美颜打开了但是视频还是无美颜 也没有美颜设置? 终究还是瞒不住了,内部员工说出董卿离开央视的原... 央视主持人几班倒啊? 你觉得央视主持人中主持春晚频率最高的是谁? 新闻联播主持人有休息日吗 谁有2002年央视内部晚会的180分钟完整视频啊,主持... 中央电视台的晚间新闻的主持人是谁? 中央电视台新闻频道晚间24小时节目主持人分别叫什么? 求2002年央视内部春晚 就是一群主持人自编自演然后... 央视内部晚会,敬一丹和经济频道那老头主持的,白... 2002年央视内部晚会的男主持人“康平”到底是谁啊? 有一个CCTV内部晚会内容 央视内部春晚是真的吗? CCTV内部春节晚会是怎么一会事 央视晚会 全是主持人 内部晚会 如何看待2002年央视新闻评论部内部晚会? 2002年央视内部春晚敬一丹主持 回忆下央视主持人内部春晚去,还是那个给力 线程runnable和callable的区别 JAVA中Callable的call方法抛出的异常会抛到那里? java中使用继承Callable的方式实现多线程? runnable和callable区别是什么? 为什么并发包抽出了runnablefuture接口 java JAVA关于callable接口的多线程问题 创建多线程有几种方法 java线程Callable怎么启动的问题 java多线程的几种实现方法及多窗口售票小程 Java如何实现方法的阻塞 java协程和futuretask的区别 FutureTask是什么? 在Java 中多线程的实现方法有哪些,如何使用 什么是java多线程详解 创建线程有哪几种方式 如何在java中获取线程异步执行之后的结果 java并发框架有哪些 自己怎么做小程序商城 做一个小程序商城大概需要多少钱? 自己可以做小程序商城吗
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com