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

本文深入探讨了在实际编程中为何开发者更倾向于使用Runnable接口而非继承Thread类来创建线程。通过对比两种方式的优缺点,揭示了实现Runnable接口在多线程处理同一资源场景下的优势,以及继承Thread类的局限性。同时,文章展示了如何利用这两种方法实现简单的线程操作,并强调了选择合适的设计模式对于提高代码效率和可维护性的关键作用。

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;

	// 实现接口中抽象方法
	@Override
	public 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接口的类不仅实现了面向接口编程的思想,而且类的实例可以产生多个线程,来运行相同的程序。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值