java多线程学习之10 创建线程的两种方式

thread可以有两种创建方式:
第一种 使用Thread class
第二种通过Runnable interface

注意:通过Runnable interface所创建的线程 (通常)需要一个thread的instance,所以我们先从Thread class 开始学起。

创建Thread
生命周期的第一个阶段是Thread的创建。thread是由Thread class的instance来表示,
所以创建thread是通过调用该class的constructor来完成。在我们的范例中使用了最简单的constructor其他 Thread class 的constructor 能够让你指定thread的名称或者
Runnable对象以作为thread的target来运行

自定义一个线程类
什么时候通过使用implements Runnable接口来获得?什么时候通过 extends Thread来获得?这是一个必须要知道的问题。
——————————————————————————————————————————————————————
Runnable这个接口能够让你将你的线程(task)从执行此线程(task)的另外一个(外部的一个)Thread类型对象中分离出来。

事实上有时候使用implements Runnable interface是对的,而有时候使用extends Thread是对的。这要具体问题具体分析,因境遇而异(议)。
答案是你是否需要新的要创建的线程性质类继承Thread类的既有行为或者你创建的这个线程性质类是否还打算继承其他的功能类。

例如我们定义了一个线程类 MyThread 要求该类能够使用interrupt()方法来实现将该线程中断,那么你创建的这个MyThread最好就 extends Thread,因为interrupt()方法是
Thread类的一部分,而我们能中断 MyThread 对象的原因就是 MyThread extends Thread了。
注意单纯实现了Runnable 接口的线程类 是不具备interrupt()成员方法的(切记)这是因为 这个自定义的线程类没有extends Thread所以它就没有从Thread类继承而来的interrupt()方法!。

那么什么时候考虑通过 implements Runnable 接口来创建一个自定义线程类呢?
答:第一该自定义的线程类打算继承其他的功能类(java只支持单继承模式,只要extends 了一个类,则该类就不能直接extends 其他类了)。
第二需要支持Runnable接口回调的功能的使用。例如:java 针对Runnable这个借口做了许多处理线程相关的功能类,这些功能类可以处理如 “线程池 threading pool”,"任务计划 task scheduling",或“timing 定时”等主题的有关线程的功能问题。而如果要使用这些功能类(API)的前提就是 你的这个自定义线程类(task性质类)必须要支持针对Runnable接口的接口回调(多态)功能,即你的这个自定义task性质类必须是Runnable接口的类型对象。此时你的自定义线程类的实现就要考虑利用implements Runnable去获得。


综合上面所述:
implements Runnable与extends Thread的方式来获得你自己定义的task性质类的手段,在使用的目的与意义上上各有千秋。
所以到底使用那一种方式得你自己决定,重要的一项启发式规则是:
可以implements Runnable的方式取得稍多一点的应用灵活性,但是要付出分别自己管理Thread类型对象的代价,或者以牺牲应用(多应用功能)的灵活性来extends Thread来获得task的简化性,和以管理性(直接继承Thread类而得到的自定义线程类,相对简洁且易管理,从继承Thread而来的用来管理线程用的API方法较多),这得由你自己折衷决定。

通常:使用Runnable接口去构建线程类(任务性质类)会让我们对开发的task任务类型性质类在uml所倡导的类层次结构上有更大的弹性。task(任务)可以是Thread类型对象或是关于thread的Runnable类型对象。使用Runnable interface能够让如何精确定义task更有弹性,但是两种方式对不同的状况各有所长。

______________________________________________________________________________
实现Runnalbe接口的线程对象所具有的特点
第一:就是所谓的可执行性(Runnable)(具有了程序性,线程性)
第二:java语言本身提供的针对Runnable类型的线程对象(针对Runnable接口回调机制)以提升线程性能的 API方法较多。
第三:因为Runnable只是个接口(行为协议),因此实现了该接口的类(对象)只是声明了其具有“可执行性”没有其他的实体特征,因此这样的线程(任务task)可再次被精确定义成具有其他特征(实体特征)的一种另外一种实体特征概念类。从而使得通过实现Runnable接口的任务类可具有更精确的其他实体特征意义,通过实现其他接口或者继承其他父类来体现。适用于不是单纯为了具有线程性(任务性)的线程对象的定义。这种线程类还可能同时具有相当明显和针对性的实体特征且这种实体特征特别需要去突出的表达出来。(通过面向对象的分析与设计与编程去表达出来)
——————————————————————————————————————————————
直接通过extends Thread类的线程对象所具有的特点
第一:具有线程的本质定义所具有的特性,即任务性,程序的一个执行体分支,程序的一次动态执行,等特性
第二:易管理性,java语言本身对直接继承Thread类的线程对象提供了系列特有的管理线程方便的API方法,这些方法都是封装在Thread这个父类(基类,模板类)中的,从而要获得这些易管理性(管理Thread的特有方法),自定义的线程类就必须继承Thread这个模板类(父类),由于java语言只支持单继承(直接继承)因此继承了Thread类的具有任务性质的自定义线程类就不能够继承其他类了,因此在以继承为基础的代码重用和功能重用上,这个灵活性就缺失了。
——————————————————————————————————————————
Runnable和Thread的比较
综上所述
Runnable和Thread类的使用就各有千秋

Runnable类型的线程对象,可以具有其他明显的实体特征(继承其他的类来获得这些特征),可以灵活使用,且优化线程性能的java 提供的API方法较多。但是缺乏易管理性(因为没有继承自Thread类的管理线程用的系列方法)

Thread类型对象由于继承了Thread类所以其与生俱来Thread类型类的以管理特性,但是不能够继承其他父类了(缺乏灵活性),而且在没有实现Runnable接口的情况下不能够使用
java 提供的基于Runnable接口回调机制的提高线程性能的系列API了。缺乏应用的灵活性,使用范围大大降低,应用范围也大大减低。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值