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接口的类不仅实现了面向接口编程的思想,而且类的实例可以产生多个线程,来运行相同的程序。
ASP.Net+Android+IOS开发.Net培训期待与您交流!