Java中Runnable和Thread的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中Runnable和Thread的区别相关的知识,希望对你有一定的参考价值。
区别:Thread是类,而Runnable是接口。抽象类和接口的区别如下:
① 在类来继承抽象类时,只需实现部分具体方法和全部抽象方法,而实现接口则要实现里面的全部方法。
②在接口中无成员变量,而抽象类中可有成员变量。
在Java中引进接口主要是为了解决多继承的问题。
实现多线程主要继承Thread 类和实现Runnable接口。 参考技术A
1、在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;
Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类。这也是此方法的局限。
2、继承Thread实现的模式是 定义多个线程,各自完成各自的任务.
实现Runnable实现的模式是 定义多个线程,实现一个任务.
3、在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享
thread是类,runnable是接口,都可以是多线程,
但是在创建多线程的方法中我们可以有2种方法
class MyThread extends Threadpublic void run()
System.out.println("this is thread");
class MyRunnable implements Runnable
public void run()
System.out.println("this is runnable");
在实际使用中我们推荐使用runnable方法
因为如果使用thread的话就不能继承其他类(ps:一个类只能继承一个父类)
但是runnable就不同(一个类可以实现多个接口)
以上是我的理解
参考技术C以下是一篇简单的介绍,我翻过来给你看下。
在 Java 语言中,我们都知道有俩种方式可以创建一个线程。
继承 Thread 类 。
实现 Runnable 接口 。
代码如下:
//new Thread(new MyWork()).start();public class MyWork implements Runnable
public void run()
// your work here ...
//Thread.start();
public class MyThread extends Thread
public MyThread()
super("MyThread");
public void run()
// your work here ...
这俩的区别讨论很多。我总结了大概有以下几点。
实现 Runnable 大多数情况下是比继承 Thread 更好的方法。
Java 只支持单继承,所以你继承了 Thread 的话,其他的类你就不能继承了。
如果实现 Runnable 接口,多线程可以直接将你的工作并发处理(直接使用 start)。而继承 Thread 不能直接进行多线程工作,你得为你的每一部分工作都定义一个线程。
其他的一些API,接口都是 Runnable 类型的。比如 Java 内置的线程池 API ExcutorService 等。
其实 Thread 只是实现 Runnable 接口,并增加了一些常用方法而已。不信你看源码。
class Thread implements Runnable
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static
registerNatives();
... 参考技术D 线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法,
我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样.
你简单的调用run方法是没有这样效果的,所以你必须调用Thread类的start方法来启动你的线程.所以你启动线程有两种方法
一是写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程
二是写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动
这两种方法都必须实现RUN方法,这样线程起动的时候,线程管理器好去调用你的RUN方法.
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享
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的区别的主要内容,如果未能解决你的问题,请参考以下文章