继承Thread与实现Runnable接口的区别

写在最前面的

为了弄明白两种方式的差异,可谓饶了一大圈。但是很欣慰发现了两篇博文都有明显的错误,最后恍然悟出 ,这两者的差异就是java面向对象的基本特征,即:继承、封装、多态。

建立在面向对象的特征上理解两者的差异就很简单了

  • 继承Thread并重写run方法
    • 子类重新父类Thread.run()方法,运行时jvm执行的是子类的重写后的run实现,这便是继承和多态的体现
  • 实现Runnable接口并添加run方法实现
    • 运行时jvm执行的也是子类的实现的run方法,这一点也是多态的体现
    • 与继承实现不同的是,该类可以实现多个接口,再次体现出封装的特性
public class IntegrationTaskHandler implements Runnable, ServletContextListener {
    
    //可以作为一个线程运行run方法
	public void run() {
	}
    //可以作为一个listener执行contextDestroyed、contextInitialized方法
	public void contextDestroyed(ServletContextEvent arg0) {
	}
	public void contextInitialized(ServletContextEvent arg0) {
	}
}

https://blog.csdn.net/jingzi123456789/article/details/69830907

         这个博文在最后的列子中,extends方式调用的是同一个对象的start,而在runnable的实现中则调用四个不同对象的start ,这四个线程输出name的时候当是四个不同的对象name,并没有证明两种实现方式的根本差异。

https://blog.csdn.net/xdd19910505/article/details/50732328

         这个博文在runnable例子中,new 出四个Thread(Runnable) ,其实private的变量引用也是四个不同的对象breakfast ,每个breakfast的初始值为10 。 也就是说和extends的例子并没有什么不同,也没有说明白两种实现方式的差异。

最后,无论如何两位作者都对笔者理解两种线程创建方式的差异起到了非常积极的作用。在此感谢!

以下是学习过程中碰到的相关概念

两个基本概念

区分进程和线程

进程是一个程序在其自身的地址空间中执行一次活动,是资源申请、调度和独立运行的单位。

线程是进程中的一个单一的连续控制流程,一个进程可以包含一个或多个线程。

线程的分类

http://www.cnblogs.com/super-d2/p/3348183.html

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

Daemon的作用是为其他线程的运行提供服务,比如说GC线程

守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:public final void setDaemon(boolean on) ;但是有几点需要注意:

1)、thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。

2)、 在Daemon线程中产生的新线程也是Daemon的

3)、不是所有的应用都可以分配给Daemon线程来进行服务,比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。

原因如下:

当一个线程退出时,JVM会检查其他正在运行的线程,如果这些线程都是守护线程,那么JVM会正常退出操作。当JVM停止时,所有任然存在的守护线程都将被抛弃----既不会执行finally代码块,也不会执行回卷栈,而JVM只是直接退出。---《java concurency practice》

         User Thread(用户线程)其实就是我们常见的业务处理线程。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值