Java中Runnable和Thread以及Callable的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中Runnable和Thread以及Callable的区别相关的知识,希望对你有一定的参考价值。

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中的线程结果,就会被阻塞直到线程结束。
就相当于现在的期房,你把手续和钱都交上去了,就可以马上拿到合同,但只有合同没有房子。这个时候你已经是有房一族了,你可以先去买家电买装修(走下面的其他逻辑)。但是你要把家电和装修放进去,就必须等到房子完工(阻塞)。
参考技术A 在java中,其实java中实现 多线程有三种方法,一种是继承Thread类;第二种是实现Runnable接口;第三种是实现Callable接口。

1,继承Thread

Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。

2,Runnable接口

在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口

在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口

两种实现方式的区别和联系:

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

1) 避免点继承的局限,一个类可以继承多个接口。

2) 适合于资源的共享

Runnable接口和Thread之间的联系:

public class Thread extends Object implements Runnable

发现Thread类也是Runnable接口的子类。

3,Callable接口

Callable 和 Runnable 的使用方法大同小异, 区别在于:

1) Callable 使用 call() 方法, Runnable 使用 run() 方法

2) call() 可以返回值, 而 run()方法不能返回。

3) call() 可以抛出受检查的异常,比如ClassNotFoundException, 而run()不能抛出受检查的异常。

以上是关于Java中Runnable和Thread以及Callable的区别的主要内容,如果未能解决你的问题,请参考以下文章

Java中Runnable和Thread的区别

Java多线程机制中使用Runnable接口以及线程的常用方法//设备管理概述(20.6.5)

Java多线程机制中使用Runnable接口以及线程的常用方法//设备管理概述(20.6.5)

Java中Runnable和Thread

Java中Runnable和Thread的区别

Java中Runnable和Thread的区别