java学习之创建线程方法二
2013-10-20 13:09
260 查看
我们上一节当中讲到了创建线程的第一种方法,就是继承Thread类,覆写Thread当中的run方法,然后创建子类对象,之后调用对象的start方法启动线程。但是这种方法有一个缺陷,因为我们知道在java当中类与类当中是单继承的关系,假如现在我们的子类是另外一个类的子类,这个时候如果这个子类想使用多线程的话,就没有办法了。我们之前说接口的时候,知道接口的存在就是为了扩展类的功能,而避免多继承。那么有没有一种方法可以通过实现接口来完成多线程的创建呢?我们查阅Api可以知道,在java当中为我们提供了一个Runnable接口。在查阅文档的同时,我们知道在Runnable这个接口当中,只有一个run方法。我们只能实现Runnable这个接口中的方法,但是我们知道用在Runnable接口当中只有一个run方法,但是线程的启动需要start()方法,那么这个时候应该怎么办呢?在Thread类中有一个构造函数,他接受一个Runnable类型的参数,然后创建一个线程。在Runnable的run方法当中,也有一个说明是说:需要启动一个线程来调用Runnable当中的run方法。
代码实例(用Runnable来创建线程):
在这种方法当中我们创建线程的步骤就是:
1、定义一个类然后实现Runnable当中的run方法
2、创建该类实例
3、创建线程对象,并且把上个类的实例当作构造参数传入该线程对象
4、调用线程对象的start()方法,开启线程。
细节:在用这种方式创建线程对象的时候,这里有几个需要注意的地方。第一个就是本身在Thread类当中就有一个run方法,但是我们实现的Runnable接口当中也有一个run方法,这个时候就存在一个问题。就是,当我们调用run方法的时候到底是使用的那一个run方法呢?这个时候就用到了策略模式。其实这个时候,在构造函数的时候,先判定当前的对象是否有传入的参数,如果有传入的参数就调用传入的参数即Runnable接口的run方法,如果没有就调用本身的run方法,在代码上的体现就是:
这个时候就确定应该调用谁的方法了。
Runnable线程的设计思想:
在创建线程的第一种方式当中,要创建线程必须继承Thread类,但是继承Thread类之后,该类也成了Thread类的体系,具备了Thread当中那些自己并不大需要的方法。并且该类一旦继承Thread类之后就成了他的体系了。此时我们把其中的任务分离出来,之后把他封装成接口。这样就能够让其他的类继承这个接口,然后把这个接口传入到Thread的对象当中来调用,这样就避免了java单继承的局限性,也降低了任务与线程之间的耦合性。
Runnable接口的好处:
1、将任务从线程当中抽离出来,进行了封装,把任务封装成了对象。
2、避免了java单继承的局限性。
一般这种创建方法比较常用。
代码实例(用Runnable来创建线程):
class Demo4 implements Runnable { public void run() { for(int i = 0; i<=10 ; 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线程学习——创建线程的两种方法
- Java学习之旅--线程的创建方法
- JAVA学习笔记49——线程概念+进程、线程区别+创建进程三种方法
- java学习日记(5)——创建线程的两种基本方法
- Java线程学习03/【线程创建的俩种方法】/byme
- java基础学习总结——线程之使用Runnable接口创建线程的方法
- Java多线程学习之线程的创建方法
- java中创建线程的几种方法及区别
- Java并发学习之十——用线程工厂创建线程
- java学习日记_99:线程的设置优先级和常用方法
- 【搞懂Java多线程之一】多线程相关概念,线程生命周期以及线程创建方法
- 学习effective java-4创建和销毁对象之利用私用构造方法强化类的非实例化
- Java 创建线程的两种方法
- Java创建线程的两个方法
- java线程学习5——线程同步之同步方法
- Java创建线程的两个方法
- java学习之路 之 面向对象编程-类的成员之属性、方法及对象的创建和使用
- java 多线程总结(一) 创建线程的几种方法及对终止线程运行的讨论
- JAVA线程的创建(学习笔记)
- Java线程学习-创建线程,线程的简单实用