黑马程序员--基础加强--第四篇--继承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接口的类不仅实现了面向接口编程的思想,而且类的实例可以产生多个线程,来运行相同的程序。
- 黑马程序员--基础加强--第四篇--继承Thread类和实现Runnable接口有什么区别?
- 对于多线程类 实现Runnable接口和继承Thread类有什么区别
- 继承Thread类和实现Runnable接口的区别。
- 继承Thread父类和实现Runnable接口的区别
- Java 继承Thread类和实现Runnable接口的区别
- Java 继承Thread类和实现Runnable接口的区别
- 实现Runnable接口和继承Thread类区别
- 黑马程序员----多线程1(继承Thread类、实现Runnable接口)
- Java 多线程实现接口Runnable和继承Thread区别
- Java 多线程实现接口Runnable和继承Thread区别
- Java 多线程实现接口Runnable和继承Thread区别 (2
- Java 多线程实现接口Runnable和继承Thread区别
- 黑马程序员-线程Thread类和Runnable接口
- 线程实现方式-继承Thread类和实现Runnable接口的区别
- 多线程中的继承Thread类和实现Runnable接口的区别
- 多线程——继承Thread 类和实现Runnable 接口的区别
- 通过继承Thread类和通过实现Runnable接口 创建线程的区别
- 细说继承Thread类和实现Runnable接口来创建线程的区别
- 单例模式
- ARM协处理器指令
- Java bytecode: Understanding bytecode makes you a better programmer
- linux高级网络配置
- VS2013安装
- 黑马程序员--基础加强--第四篇--继承Thread类和实现Runnable接口有什么区别?
- Python Unittest源码分析
- PC机交叉编译ARM boost库
- POJ 3177 Redundant Paths / 边双连通分量
- 微信服务号VS订阅号
- SurfaceView实现双缓冲避免游戏闪屏
- C++中的const
- Deployment failure on Tomcat 6.x. Could not copy all resources...
- 程序猿起步篇