我们上一节当中讲到了创建线程的第一种方法,就是继承Thread类,覆写Thread当中的run方法,然后创建子类对象,之后调用对象的start方法启动线程。但是这种方法有一个缺陷,因为我们知道在java当中类与类当中是单继承的关系,假如现在我们的子类是另外一个类的子类,这个时候如果这个子类想使用多线程的话,就没有办法了。我们之前说接口的时候,知道接口的存在就是为了扩展类的功能,而避免多继承。那么有没有一种方法可以通过实现接口来完成多线程的创建呢?我们查阅Api可以知道,在java当中为我们提供了一个Runnable接口。在查阅文档的同时,我们知道在Runnable这个接口当中,只有一个run方法。我们只能实现Runnable这个接口中的方法,但是我们知道用在Runnable接口当中只有一个run方法,但是线程的启动需要start()方法,那么这个时候应该怎么办呢?在Thread类中有一个构造函数,他接受一个Runnable类型的参数,然后创建一个线程。在Runnable的run方法当中,也有一个说明是说:需要启动一个线程来调用Runnable当中的run方法。

代码实例(用Runnable来创建线程):

 class Demo4 implements Runnable
{ public void run()
{ for(int i = ; i<= ; i++)
System.out.println("Dangqianxiancheng"+Thread.currentThread().getName()+"i is "+i); } } class ThreadDemo4
{ public static void main(String[] args) { Demo4 d = new Demo4();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start(); } }

在这种方法当中我们创建线程的步骤就是:

1、定义一个类然后实现Runnable当中的run方法

2、创建该类实例

3、创建线程对象,并且把上个类的实例当作构造参数传入该线程对象

4、调用线程对象的start()方法,开启线程。

细节:在用这种方式创建线程对象的时候,这里有几个需要注意的地方。第一个就是本身在Thread类当中就有一个run方法,但是我们实现的Runnable接口当中也有一个run方法,这个时候就存在一个问题。就是,当我们调用run方法的时候到底是使用的那一个run方法呢?这个时候就用到了策略模式。其实这个时候,在构造函数的时候,先判定当前的对象是否有传入的参数,如果有传入的参数就调用传入的参数即Runnable接口的run方法,如果没有就调用本身的run方法,在代码上的体现就是:

 class Thread()
{ private Runnable r;
Thread(){}
Thread(Runnable r)
{ this.r = r; }
public void run()
{ if(r != null)
r.run(); }
public void start()
{ } }

这个时候就确定应该调用谁的方法了。

Runnable线程的设计思想:

在创建线程的第一种方式当中,要创建线程必须继承Thread类,但是继承Thread类之后,该类也成了Thread类的体系,具备了Thread当中那些自己并不大需要的方法。并且该类一旦继承Thread类之后就成了他的体系了。此时我们把其中的任务分离出来,之后把他封装成接口。这样就能够让其他的类继承这个接口,然后把这个接口传入到Thread的对象当中来调用,这样就避免了java单继承的局限性,也降低了任务与线程之间的耦合性。

Runnable接口的好处:

1、将任务从线程当中抽离出来,进行了封装,把任务封装成了对象。

2、避免了java单继承的局限性。

一般这种创建方法比较常用。

java学习之创建线程方法二的更多相关文章

  1. java学习之- 创建线程run和start特点

    标签(空格分隔): run,start 为什么做run方法的覆盖? 1.Thread类用于描述线程,该类就定义一个功能用于存储线程要运行的代码,该存储功能就是run方法: 也就是说Thread种的ru ...

  2. Java学习-026-类名或方法名应用之二 -- 统计分析基础

    前文讲述了类名或方法的应用之一调试源码,具体请参阅:Java学习-025-类名或方法名应用之一 -- 调试源码 此文主要讲述类名或方法应用之二统计分析,通过在各个方法中插桩(调用桩方法),获取方法的调 ...

  3. #Java学习之路——基础阶段二(第五篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  4. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  5. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  6. Java并发--如何创建线程

    下面是本文的目录大纲: 一.Java中关于应用程序和进程相关的概念 二.Java中如何创建线程 三.Java中如何创建进程 转载原文链接:http://www.cnblogs.com/dolphin0 ...

  7. 【多线程】创建线程方式二:实现Runnable接口

    创建线程方式二:实现Runnable接口 代码示例: /** * @Description 实现Runnable接口,重写run方法,执行线程需要丢入Runnable接口实现类,调用start方法 * ...

  8. Java中如何创建线程

    Java中如何创建线程 两种方式:1)继承Thread类:2)实现Runnable接口. 1.继承Thread类 继承Thread类,重写run方法,在run方法中定义需要执行的任务. class M ...

  9. Java学习-025-类名或方法名应用之一 -- 调试源码

    上文讲述了如何获取类名和方法名,敬请参阅: Java学习-024-获取当前类名或方法名二三文 . 通常在应用开发中,调试或查看是哪个文件中的方法调用了当前文件的此方法,因而在实际的应用中需要获取相应的 ...

随机推荐

  1. DevExpres表格控件运行时动态设置表格列

    本文是系列文章,陆续发表于电脑编程技巧与维护杂志. DevExpres产品是全球享有极高声誉的一流控件套包产品!国内典型用户包括:用友.金蝶.神州数码.工信部.中国石化.汉王科技等众多大中型科技型企业 ...

  2. C#如何配置应用程序域

    转载:http://www.csharpwin.com/csharpspace/9175r9023.shtml 您可以使用 AppDomainSetup 类,为新应用程序域提供带有配置信息的公共语言运 ...

  3. 查看SQL server 2008 R2 的Service Package 版本号(同样适用于SQL Server 2005)

    在SQL Server 中新建一个查询(new Query),然后输入下面的SQL脚本,即可看到当前的数据库的Service Package (补丁包)的版本号 select serverproper ...

  4. 学习笔记_Java_day12_Cookie

    Cookie 1 Cookie概述 1.1 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie就是一个键和一个值构成的 ...

  5. UVA 11078 Open Credit System(扫描 维护最大值)

    Open Credit System In an open credit system, the students can choose any course they like, but there ...

  6. HDU_2014 青年歌手大奖赛_评委会打分

    Problem Description 青年歌手大奖赛中,评委会给参赛选手打分.选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分.   Input 输入数据有多组,每 ...

  7. OpenCV(5)-图像掩码操作(卷积)-锐化

    锐化概念 图像平滑过程是去除噪声的过程.图像的主要能量在低频部分,而噪声主要集中在高频部分.图像的边缘信息主要也在高频部分,在平滑处理后,将会丢不部分边缘信息.因此需要使用锐化技术来增强边缘. 平滑处 ...

  8. github 查看单个文件的历史记录命令

    gitk 安装: apt-get install gitk 点击打开链接http://stackoverflow.com/questions/278192/view-the-change-histor ...

  9. DOM Ready 详解

    DOM Ready 概述 熟悉jQuery的人, 都知道DomReady事件. window.onload事件是在页面所有的资源都加载完毕后触发的. 如果页面上有大图片等资源响应缓慢, 会导致wind ...

  10. php类的方法

    方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法. 同属性一样,类的方法也具有pub ...