差别
1.继承thread的类,在创建它的对象时,创建两个thread,他们各自执行各自的进程,互不干扰,Thread类当中的数据也是彼此独立。
但是在Runnable中,创建一个实现了Runnable接口的类的对象后,可以将这一个对象分别在创建进程时都传递给线程的构造函数:
ImplementRunnable r1 = new ImplementRunnable();
ImplementRunnable r2 = new ImplementRunnable();
Thread t1 = new Thread(r1, "张三");
Thread t2 = new Thread(r1, "lisi");
使得线程在执行时,调用的是同一个Runnable实现类对象,那么Runnable实现类当中的数据,就是两个线程共享的数据。
具体如下代码及其执行结构所示:
Runnable实现类
public class ImplementRunnable implements Runnable {
private int a = 0;
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 20; i++) {
System.out.println("Thread--" + Thread.currentThread().getName() + "--运行;a为:" + (a++));
}
}
}
**Thread继承类**
public class ExtendThread extends Thread {
private int a = 0;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for (int i = 0; i < 20; i++) {
System.out.println("Thread--" + getName() + "--运行;a为:" + (a++));
}
}
}
运行的调用类
public class ThreadText {
public static void main(String[] args) {
// TODO Auto-generated method stub
// ExtendThread thread1 = new ExtendThread();
// thread1.setName("张三");
// ExtendThread thread2 = new ExtendThread();
// thread2.setName("lisi");
// thread1.start();
// thread2.start();
ImplementRunnable r1 = new ImplementRunnable();
ImplementRunnable r2 = new ImplementRunnable();
Thread t1 = new Thread(r1, "张三");
Thread t2 = new Thread(r1, "lisi");
t1.start();
t2.start();
}
}
最后的运行结果:
在使用Runnable实现类的方法中,a的值是两个线程共享的,每个线程运行20次,但是线程终端的地方是不一定的,所以有可能出现a线程运行++但是还没有运行输出结果就中断了,然后b运行,所以就出现0在1前面了。
在使用Thread继承类的方法时,创建两个线程,各自运行,数据并不共享,各自运行20次循环。