黑马程序员--基础加强--第四篇--继承Thread类和实现Runnable接口有什么区别?

来源:互联网 发布:软件安装调试方案 编辑:程序博客网 时间:2024/06/06 12:34

ASP.Net+Android+IOS开发.Net培训期待与您交流!

总所周知,创建线程有两种方式,继承Thread类,和实现Runnable接口,可是为什么在实际写程序中大家都习惯实现Runnable接口呢?我们通过一个例子来看看是为什么呢?疑问疑问疑问

继承Thread类步骤:

1,定义类继承Thread

2,复写Thread类中的run方法。

目的:将自定义代码存储在run方法。让线程运行。//run();仅仅是对象调用方法。而线程创建了,并没有运行。

3,调用线程的start方法,

该方法两个作用:启动线程,调用run方法。

Demo d = new Demo();//创建好一个线程。

d.start();//开启线程并执行该线程的run方法。

d.run();//仅仅是对象调用方法。而线程创建了,并没有运行

实现Runable接口步骤:

1,定义类实现Runnable接口

2,覆盖Runnable接口中的run方法。

将线程要运行的代码存放在该run方法中。

3,通过Thread类建立线程对象。

4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

为什么要将Runnable接口的子类对象传递给Thread的构造函数。

因为,自定义的run方法所属的对象是Runnable接口的子类对象。

所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。

5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。


继承Thread类

public class ThreadExThread extends Thread {private int x = 0;// 实现接口中抽象方法@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("[#" + this.getName() + "]" + (++x));}}// Main方法public static void main(String[] args) throws InterruptedException {// 生成一个对象,并开启线程ThreadExThread thread = new ThreadExThread();thread.start();thread.start();}}

实现Runnable接口

public class ThreadImRunnable implements Runnable {private int x = 0;// 实现接口中抽象方法public void run() {for (int i = 0; i < 10; i++) {System.out.println("[#" + Thread.currentThread().getName() + "]"+ (++x));}}// Main方法public static void main(String[] args) throws InterruptedException {// 生成一个对象ThreadImRunnable thread = new ThreadImRunnable();// 对这个对象开启两个线程new Thread(thread).start();new Thread(thread).start();}}

使用实现Runnable接口方式创建线程可以共享同一个目标对象( ThreadImRunnable thread = new ThreadImRunnable();),实现了多个相同线程处理同一份资源,我们把上面的2个线程称为同一实例(Runnable实例)的多个线程。一个Thread的实例一旦调用start()方法,就再也没有机会运行了,这意味着: [通过Thread实例的start(),一个Thread的实例只能产生一个线程]


采用继承Thread类方式:
   <1>优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
   <2> 缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
    <1> 优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
    <2> 缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。


总结的一句话就是继承Thread类的类的实例不能产生多个线程,而实现Runnable接口的类不仅实现了面向接口编程的思想,而且类的实例可以产生多个线程,来运行相同的程序。

ASP.Net+Android+IOS开发.Net培训期待与您交流!

0 0